Mi esquema se parece a esto:
{ id: { type: String, required: true, unique: true, }, names: [ { value: { type: String, required: true }, changed_at: { type: Date, index: true, default: Date.now }, }, ], }
Con la agregación, quiero encontrar 3 documentos de mi colección con la fecha más reciente de nombres -> changes_at .
Intenté algo como esto:
[ { $unwind: '$names' }, { $sort: { 'names.changed_at': -1 } }, { $group: { _id: '$_id', names: { $push: { value: '$names.value', changed_at: '$names.changed_at' } }, id: { $first: '$id' }, }, }, { $limit: 3 }, { $lookup: { from: 'users', localField: 'id', foreignField: 'id', as: 'user', }, }, { $unwind: '$user' }, { $project: { _id: 0, old_name: { $first: '$names' }, user: { avatar_url: 1, current_tag: 1 }, }, }, ]
Pero esto no devuelve los 3 documentos actualizados más recientes. ¿Cómo puedo armar mi consulta?
Consulta
"names.changed_at"
names.changed_at
) por -1, es como ordenar según el miembro máximo de la matriz db.collection.aggregate([ { "$sort": { "names.changed_at": -1 } }, { "$limit": 3 } ])
Query2 (solución alternativa, como hacer manualmente lo que el anterior hace automáticamente)
=> tienes los 3 documentos que tienen las últimas fechas
(la consulta no devuelve las 3 últimas fechas globales, podrían estar todas en 1 documento)
Usé números por simplicidad, las fechas son las mismas.
db.collection.aggregate([ { "$set": { "max-date": { "$max": "$names.changed_at" } } }, { "$sort": { "max-date": -1 } }, { "$limit": 3 } ])
Si puede enviar algunos comentarios sobre el rendimiento, si tiene una gran colección. Comparando esas 2 formas.
La segunda consulta puede ser súper rápida si agrega a su esquema, el campo "fecha máxima" (con índice) y lo actualiza cuando agrega fechas en los names
(esto también hará un índice muy pequeño, y será rápido con seguridad )