我有一个包含以下类似文件的现有收藏集
{
"_id" : UUID("ef2f3778-c74a-4a40-9169-a7798bc6c776"),
"feedId" : UUID("677d0a5a-0ceb-43d9-954d-bfefddc22ca2"),
"events" : {
"1500" : {
"t" : ISODate("2020-08-20T02:25:00.000Z"),
"a" : {
"Manager" : "Joe",
"Amount" : 20.3
}
},
"1800" : {
"t" : ISODate("2020-08-20T02:30:00.000Z"),
"a" : {
"Manager" : "Joe",
"Amount" : 21.3
}
},
"2100" : {
"t" : ISODate("2020-08-20T02:35:00.000Z"),
"a" : {
"Manager" : "Joe",
"Amount" : 22.3
}
},
"2400" : {
"t" : ISODate("2020-08-20T02:40:00.000Z"),
"a" : {
"Manager" : "Joe",
"Amount" : 23.3
}
}
}
}
我对查询返回按时间顺序排列的所有“金额”字段值(“ t”字段)感兴趣。现在,我认识到“事件”嵌入文档的结构不太可能正确构建。它应该是一个数组。但这恐怕是徒手的,即没有选择来更改文档。如何从集合中具有相同feedId的所有对象中返回类似于[20.3、21.3、22.3、23.3等]的查询?
编辑:我将添加事件对象/文档在每个集合对象上没有统一的名称。即在这里您看到1500、1800、2100等。但是下一个文档可能只有1500和3000。
引用另一个有相同问题但似乎遇到困难的帖子(似乎没有将文档架构更改为数组):
@JF的回答使我很接近。这是对我有用的查询:
db.collection.aggregate(
[
{ $match: { feedId: 2 } },
{ $project: { events: {$objectToArray: "$events"} } },
{
"$unwind": "$events"
},
{
"$sort": {
"events.v.t": 1
}
},
{ $group: { "_id": null, Amounts: { $push: "$events.v.a.Amount" } } },
{
"$project": {
"Amounts": 1,
"_id": 0
}
}
]
)
它为我产生了预期的结果。我希望这是正确的。
结果:
/* 1 */
{
"Amounts" : [
20.3,
21.3,
22.3,
23.3,
24.3,
25.3,
26.3,
27.3,
28.3,
29.3,
30.3,
31.3,
32.3,
33.3,
34.3,
35.3,
36.3,
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句