Возврат нескольких документов, которые соответствуют самой последней дате, с помощью одного запроса MongoDB в Mongoose - PullRequest
0 голосов
/ 31 августа 2018

Следующий запрос MongoDB. Каков наилучший способ написать этот запрос в Mongoose?

db.logs.find({date: db.logs.find({}, {date:1,"_id":0}).sort({date:-1}).limit(1).toArray()[0].date})

Может быть несколько документов с одной датой, и нам нужно получить все документы, которые соответствуют самой последней дате.

1 Ответ

0 голосов
/ 31 августа 2018

Структура агрегации позволяет записать это в одном запросе. Вам потребуется конвейер с начальным оператором $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 становится тривиальным упражнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...