Структура агрегации позволяет записать это в одном запросе. Вам потребуется конвейер с начальным оператором $lookup
для самостоятельного соединения и выполнения $lookup
конвейер в объединенной коллекции, который позволяет некоррелированным подзапросам возвращать самую последнюю дату:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} }
])
Требуется еще один шаг, чтобы изменить новое поле, созданное последним, так, чтобы массив выровнялся. Используйте $addFields
для изменения формы и $arrayElemAt
для выравнивания массива или используйте "$unwind"
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } }
])
Последним шагом будет фильтрация документов в полученном конвейере с использованием $expr
на этапе $match
поскольку вы будете сравнивать поля из одного и того же документа:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } },
{ "$match": {
"$expr": {
"$eq": [ "$date", "$latest.date" ]
}
} }
])
Получение запроса к Mongoose становится тривиальным упражнением.