Есть ли запрос, который объединит глубокие подсписки? - PullRequest
2 голосов
/ 15 октября 2019

В моей базе данных у меня есть список документов, и каждый из этих документов содержит в себе еще один список документов, последний из которых представляет собой список некоторых данных с метками времени, которые хранятся в миллисекундах с начала эпохи.

Ниже приведен пример набора данных:

{
    "_id" : ObjectId("5da5aee33e791547bb418782"),
    "list1" : [
        {
            "document" : {
                "list2" : [
                    {
                        "sub-document" : {
                            "timestamp" : 100
                        }
                    },
                    {
                        "sub-document" : {
                            "timestamp" : 105
                        }
                    },
                    {
                        "sub-document" : {
                            "timestamp" : 110
                        }
                    }
                ]
            }
        },
        {
            "document" : {
                "list2" : [
                    {
                        "sub-document" : {
                            "timestamp" : 101
                        }
                    },
                    {
                        "sub-document" : {
                            "timestamp" : 104
                        }
                    },
                    {
                        "sub-document" : {
                            "timestamp" : 109
                        }
                    }
                ]
            }
        }
    ]
}

Можно ли, например, запросить 2 последних документа из всех списков "второго уровня"?

Ожидаемый результат:

[
    {
        "sub-document": {
            "timestamp": 109
        }
    },
    {
        "sub-document": {
            "timestamp": 110
        }
    }
]

1 Ответ

2 голосов
/ 15 октября 2019

Вам необходимо $ раскрутить дважды, прежде чем применять $ sort , а затем вы можете использовать $ limit , чтобы получить только два элемента. Вы также можете запустить $ replaceRoot , чтобы повысить sub-document до корневого уровня вашего результата:

db.collection.aggregate([
    { $unwind: "$list1" },
    { $unwind: "$list1.document.list2" },
    { $sort: { "list1.document.list2.sub-document.timestamp": -1 } },
    { $limit: 2 },
    { $replaceRoot: { newRoot: "$list1.document.list2.sub-document" } },
    { $sort: { "timestamp": 1 } }
])

Mongo Playground

...