mongodb - 如何将所有报告中最新的部分合并到一个主报告中?
问题描述
编辑:我发现 mongo 不允许在报告中使用特殊字符(例如点和美元符号)作为键,因此我不得不稍微重新更改 JSON 的结构。但是,我的问题仍然是一样的(我删除了旧的东西,所以它会更具可读性,但你仍然可以在编辑历史记录部分看到它)。新结构如下所示:
{
"name": "test1",
"main": [
{
"subs": [
{
"data": [
{
"group": "ABC",
"values": [
"tcsh"
]
},
{
"group": "AA",
"values": [
"6.13.00"
]
}
]
},
{
"data": [
{
"group": "xyz",
"values": [
"tcsh"
]
},
{
"group": "SADA",
"values": [
"6.13.00"
]
}
]
}
],
"main_name": "MAIN",
"main_path": "play_ground/MAIN"
},
{
"subs": [
{
"data": [
{
"group": "BAB",
"values": [
"tcsh"
]
},
{
"group": "GO",
"values": [
"6.13.00"
]
}
]
}
],
"main_name": "MAIN2",
"main_path": "play_ground/MAIN2"
}
],
"user": "easdasa",
"timestamp": "1564437533"
}
我想获取所有具有 nametest1
和 user的报告easdasa
。然后,我想取data
每块的最新块subs
。这是在时间戳的帮助下完成的。例如,在以下数组中,我有两个报告:
[{
"name": "test1",
"main": [
{
"subs": [
{
"data": [
{
"group": "xyz",
"values": [
"tcsh"
]
},
{
"group": "SADA",
"values": [
"6.13.00"
]
}
]
}
],
"main_name": "MAIN",
"main_path": "play_ground/MAIN"
}
],
"timestamp": "1564437533"
},
{
"name": "test1",
"main": [
{
"subs": [
{
"data": [
{
"group": "ABC",
"values": [
"tcsh"
]
},
{
"group": "AA",
"values": [
"6.13.00"
]
}
]
},
{
"data": [
{
"group": "xyz",
"values": [
"tcsh"
]
},
{
"group": "SADA",
"values": [
"5.0.1",
"12312"
]
}
]
}
],
"main_name": "MAIN",
"main_path": "play_ground/MAIN"
}
],
"timestamp": "1564437522"
}]
第一个报告是在第二个报告之后创建的(由于时间戳)。我可以看到第二个报告中有一个块,但第一个报告中没有:
{
"data": [
{
"group": "ABC",
"values": [
"tcsh"
]
},
{
"group": "AA",
"values": [
"6.13.00"
]
}
]
},
所以我希望最终报告能够解决它(除了第一份报告中的所有内容)。此外,您可以看到该SADA
组的值是不同的。所以我们要取第一个的报告块。最终报告应为:
{
"name": "test1",
"main": [
{
"subs": [
{
"data": [
{
"group": "ABC",
"values": [
"tcsh"
]
},
{
"group": "AA",
"values": [
"6.13.00"
]
}
]
},
{
"data": [
{
"group": "xyz",
"values": [
"tcsh"
]
},
{
"group": "SADA",
"values": [
"6.13.00"
]
}
]
}
],
"main_name": "MAIN",
"main_path": "play_ground/MAIN"
}
],
"timestamp": "1564437533"
}
换句话说,在data
级别的 (json) 值中,我想获取最新报告,在subs
级别的 (json) 值中,我想获取所有现有的潜艇。所以会更清楚,在data
级别的 (json) 值中,我想要获取最新报告的所有组和值,而对于subs
级别的 (json) 值,我想要拥有所有子项。
如果我可以指定步骤:
user
通过和获取所有报告name
。- 理论上将所有报告合并为一个主要报告(实现可能不同)。合并将由 完成
main_name
。 - 删除最新报告中已存在的所有旧
subs
值,timestamp
因此最终报告将在subs
级别中仅包含最新对象和旧报告中不在较新报告中的对象。
为了获得想要的报告,我应该进行哪个查询?
解决方案
请使用以下查询并检查统计信息,我真的可以说可以通过根据您的要求(查询)进行适当的索引来提高性能,请使用$explain
(在此处输入链接描述)来检查查询性能。我认为您的数组存在于一个以键为值的字段中,请让我知道这是否有效,或者如果它不提供示例数据,我们可以检查一下:
db.getCollection('yourcollection').aggregate([{$unwind: '$values'},{$match : {'values.name': 'test1', 'values.user': 'galih'}},
{$sort: {'values.timestamp' : -1}},
{$limit: 1}
])
推荐阅读
- c# - 试图弄清楚如何制作下一个和上一个按钮
- excel - VBA 自动化(宏)不适用于 IE 选项卡?
- sql - PrestoDB/AWS Athena- Retrieve a large SELECT by chunks
- c# - System.Drawing.Bitmap 类型的成员 ScreenShot 不能用作参数值
- mongodb - 如何使用vertx mongo客户端在mongodb聚合游标中迭代
- java - 我在使用 netbeans 时遇到了一些错误,我正在尝试使用文件
- regex - 将 python 搜索正则表达式转换为 ruby 正则表达式
- c++ - 使用 struct 和 map 创建 priority_queue
- apache-kafka - 无法重置 Kafka 偏移量
- c# - 使用枚举获取实体框架迁移错误