mongodb - 是否有可以连接深层子列表的查询?
问题描述
在我的数据库中,我有一个文档列表,这些文档中的每一个都包含另一个文档列表,后者是一些数据的列表,其中时间戳存储为自纪元以来的毫秒。
以下是样本数据集:
{
"_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
}
}
]
解决方案
在应用$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 } }
])
推荐阅读
- javascript - 如何不让父 css 影响子组件的 css?
- css - Bootstrap 4:内容重叠的固定位置侧边栏
- python - 使用 selenium python 自动化 SoundCloud
- objective-c - 尝试在 macOS 上将 RSA 私钥添加到 Keychain 失败并显示 -25303 errSecNoSuchAttr
- webots - 将对象固定在 webbot 中的位置
- amazon-web-services - 当 ECR 映像引用代码时,AWS CDK 更新 lambda 函数代码
- python - Python:即使导入了文件,也无法使用另一个文件中的变量
- vb.net - 如何通过按下按钮将组合框设置为特定项目 (Visual Basic)
- html - 如何在小屏幕尺寸上包裹网格元素?
- tableau-api - 带有条件给出错误的表格计算字段