Монго: найти не замененные документы - PullRequest
1 голос
/ 05 мая 2019

У меня есть коллекция с такими документами, как:

{
        "_id" : "ThisIsASampleId_rand12345",
        "timestamp" : ISODate("2019-04-30T10:53:34.515Z"),
        "mySpecialId" : "specialId_12345",
        "status" : "error",
}

Моя цель - найти все документы с {status: 'error'}, если нет последующих документов с такими же mySpecialId и status 'success'.

Ясно, что я могу сделать db.jobs.find({status: 'error'}), но после этого я теряюсь.

Нужно ли сделать $lookup в конвейере агрегации в той же коллекции, используя"mySpecialId" как локальные, так и внешние поля, с $match, который включает в себя что-то вроде {$gt: {timestamp: $PREVIOUS_TIMESTAMP}}?Это как-то не так.

Есть ли более простой / лучший / более элегантный способ сделать это?

1 Ответ

1 голос
/ 06 мая 2019

Вы можете $ сортировать свою коллекцию по полю timestamp, а затем запустить $ group с оператором $ last , чтобы получить самый последний документ для каждого mySpecialId.Затем вы можете просто проверить, является ли последний документ status error.Если нет, то либо все документы в этой группе имели success, либо error, который был найден, был заменен success.Чтобы вернуть оригинальную форму ваших документов, вы можете использовать $ replaceRoot .

db.col.aggregate([
    {
        $sort: { timestamp: 1 }
    },
    {
        $group: {
            _id: "$mySpecialId",
            lastDoc: { $last: "$$ROOT" }
        }
    },
    {
        $match: {
            "lastDoc.status": "error"
        }
    },
    {
        $replaceRoot: {
            newRoot: "$lastDoc"
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...