es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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á por orderId y luego tomará el primer documento para cada orderId, que será el documento con el createdAt más reciente. El operador first 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 por createdAt primero y luego agruparlos por orderId. Sin ordenar, no puedes garantizar que el documento con la createdAt más reciente sea el primero para cada orderId. Por lo tanto, ordenar la colección es necesario para esta agregación.

Comments are closed.