mongodb - Mongo 内嵌文档字段查询
问题描述
我有一个现有的集合,其中包含类似于下面的文档
{
"_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
}
}
}
}
我对返回所有按时间排序的 Amount 字段值(“t”字段)的查询感兴趣。现在,我认识到“事件”嵌入文档很可能结构不正确。它应该是一个数组。但这是我担心的手,即没有选择更改文件的选项。如何从具有相同 feedId 的集合中的所有对象中获取返回类似于 [20.3、21.3、22.3、23.3 等] 的查询?
编辑:我将补充一点,事件对象/文档在每个集合对象中没有统一的名称。即在这里您看到 1500、1800、2100 等。这个文件但下一个文件可能只有 1500 和 3000。
参考另一个有同样问题但似乎碰壁的帖子(没有将文档架构更改为数组):
解决方案
试试这个查询并检查它是否是你期望的行为(这里的例子)
请注意,我已经更改了数字的日期以便于阅读。
db.collection.aggregate([
{
"$match": {
"feedId": 2
}
},
{
"$project": {
"events": {
"$objectToArray": "$events"
}
}
},
{
"$unwind": "$events"
},
{
"$sort": {
"events.v.t": 1
}
},
{
"$group": {
"_id": "$_id",
"events": {
"$push": "$events"
}
}
},
{
"$addFields": {
"count": "$events.v.a.Amount"
}
},
{
"$project": {
"count": 1,
"_id": 0
}
}
])
首先$match
是feedId
字段,然后是必要的使用,$objectToArray
因为您的模式是由键值对象复合的。
然后$unwind
可以$sort
重新组合。
之后,我添加了一个count
包含总金额的新字段,并且我曾经$project
只缩短这个字段。
推荐阅读
- javascript - 在 express 中为 cookie 生成随机 ID
- javascript - 如何从javascript中两个数组的总和值中只接收偶数?
- sql - 在计算列中将值与 DATEDIFF 结果相乘的函数
- python - Deepcopy 使用自定义 __hash__ 函数产生“返回带有错误集的结果”
- dart - 如何在 web only dart 项目中使用 dartshelf_router
- android - 哪些意图/广播在 Android 中可能是“粘性的”?
- wpf - 如何在谷歌浏览器中使用铬引擎来呈现我的应用程序
- javascript - 使用 oAuth2 和 jQuery/AJAX 连接 Box
- python - 如何将元素插入 DataFrame 行对象?
- gitlab - GitLab-CI - 如何在作业中运行所有脚本并获得错误状态