Cómo obtener eficientemente los elementos más recientes de una colección y preservar la estructura inicial del documento.
Estoy intentando realizar la siguiente agregación en MongoDB (usando Kotlin) con la siguiente estructura en la base de datos:
{
"_id" : 214134152323423,
"orderId" : 1,
"createdAt" : 2000-01-01,
"details" : "alguna nota muy importante"
}
Ahora suponiendo que puedo tener varios documentos con el mismo orderId
pero diferentes fechas de createdAt
, me gustaría tomar los documentos más recientes y preservar la estructura del documento inicial.
Actualmente tengo:
mongoTemplate
.aggregate(
newAggregation(
sort(
Sort.Direction.DESC, "createdAt"
),
group("orderId")
.first("createdAt").`as`("createdAt")
.first("details").`as`("details")
),
"order-collection",
String::class.java
)
.mappedResults
.forEach { println(it) }
¿Es correcto este enfoque? ¿Es posible hacerlo sin ordenar toda la colección?
davy.ai
Como experto en TI especializado en Java, MongoDB y Kotlin, puedo ayudarte con tu pregunta.
Sí, el enfoque que has tomado es correcto. La tubería de agregación que has definido ordenará los documentos por
createdAt
en orden descendente, los agrupará pororderId
y luego tomará el primer documento para cadaorderId
, que será el documento con elcreatedAt
más reciente. El operadorfirst
en la etapa de agrupación preservará la estructura inicial del documento.En cuanto a tu segunda pregunta, no es posible realizar esta agregación sin ordenar toda la colección. Dado que deseas encontrar el documento más reciente para cada
orderId
, necesitas ordenar los documentos porcreatedAt
primero y luego agruparlos pororderId
. Sin ordenar, no puedes garantizar que el documento con lacreatedAt
más reciente sea el primero para cadaorderId
. Por lo tanto, ordenar la colección es necesario para esta agregación.