首页 > 解决方案 > 是否有可以连接深层子列表的查询?

问题描述

在我的数据库中,我有一个文档列表,这些文档中的每一个都包含另一个文档列表,后者是一些数据的列表,其中时间戳存储为自纪元以来的毫秒。

以下是样本数据集:

{
    "_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
        }
    }
]

标签: mongodbmongodb-queryaggregation-framework

解决方案


在应用$sort之前,您需要$unwind两次,然后您可以使用$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 } }
])

蒙戈游乐场


推荐阅读