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.

Mongodb: Obtener documentos principales

No puedo encontrar respuesta a un problema en Google ni en SO.

Tengo una colección tal como:

{ "_id" : "0", "timestamp" : 160000 }
{ "_id" : "00", "timestamp" : 160000 }
{ "_id" : "000", "timestamp" : 150000 }

Quiero obtener las primeras filas basadas en la marca de tiempo (timestamp), no solamente la primera.

Por ejemplo, esto:

{ "_id" : "0", "timestamp" : 160000 }
{ "_id" : "00", "timestamp" : 160000 }

La solución obvia sería ordenar DESC y obtener las primeras n filas, pero esto no haría exactamente lo que se requiere, necesitaría saber el número de elementos superiores, etc.

Me gustaría obtener la marca de tiempo de la primera fila y luego buscar todas las filas que tengan esa marca de tiempo, o quizá alguna otra cosa?

¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las filas con el timestamp más alto, puede utilizar la siguiente tubería de agregación de MongoDB:

    db.collection.aggregate([
      { $sort: { timestamp: -1 } }, // Ordenar por `timestamp` en orden descendente.
      { $group: { _id: "$timestamp", docs: { $push: "$$ROOT" } } }, // Agrupar por `timestamp` y colocar todos los documentos en un array.
      { $limit: 1 }, // Tomar solo el grupo con el `timestamp` más alto.
      { $unwind: "$docs" }, // Desenrollar el array de documentos.
      { $replaceRoot: { newRoot: "$docs" } } // Reemplazar el documento raíz con los documentos originales.
    ])
    

    Esta tubería primero ordena la colección por timestamp en orden descendente. Luego, agrupa los documentos por timestamp y coloca todos los documentos de cada grupo en un array. La tubería toma solo el primer grupo (que tiene el timestamp más alto), desenrolla el array de documentos y reemplaza el documento raíz con los documentos originales.

    Esto devolverá todos los documentos con el timestamp más alto.

Comments are closed.