Mongodb Mongo嵌入式文档字段查询
我有一个与以下类似的文档的现有集合Mongodb Mongo嵌入式文档字段查询,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个与以下类似的文档的现有集合 { "_id" : UUID("ef2f3778-c74a-4a40-9169-a7798bc6c776"), "feedId" : UUID("677d0a5a-0ceb-43d9-954d-bfefddc22ca2"), "events" : { "1500" : { &qu
{
"_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
参考另一篇文章,他有同样的问题,但似乎遇到了麻烦(没有将文档模式更改为数组):
尝试此查询并检查它是否是您期望的行为(示例) 请注意,为了便于阅读,我已经更改了日期
db.collection.aggregate([
{
“$match”:{
“feedId”:2
}
},
{
“$project”:{
“事件”:{
$objectToArray:“$events”
}
}
},
{
“$unwind”:“$events”
},
{
“$sort”:{
“事件v.t”:1
}
},
{
“$group”:{
“\u id”:“$\u id”,
“事件”:{
“$push”:“$events”
}
}
},
{
“$addFields”:{
“计数”:“$events.v.a.金额”
}
},
{
“$project”:{
“计数”:1,
“\u id”:0
}
}
])
首先使用$match
字段feedId
,然后必须使用$objectToArray
,因为您的模式是由键值对象组合而成的。然后,
$unwind
to可以执行$sort
并重新分组。在此之后,我添加了一个新字段
count
,其中包含总金额,并且我使用$project
仅显示此字段。尝试此查询并检查它是否是您期望的行为(示例)
请注意,为了便于阅读,我已经更改了日期
db.collection.aggregate([
{
“$match”:{
“feedId”:2
}
},
{
“$project”:{
“事件”:{
$objectToArray:“$events”
}
}
},
{
“$unwind”:“$events”
},
{
“$sort”:{
“事件v.t”:1
}
},
{
“$group”:{
“\u id”:“$\u id”,
“事件”:{
“$push”:“$events”
}
}
},
{
“$addFields”:{
“计数”:“$events.v.a.金额”
}
},
{
“$project”:{
“计数”:1,
“\u id”:0
}
}
])
首先使用$match
字段feedId
,然后必须使用$objectToArray
,因为您的模式是由键值对象组合而成的。然后,
$unwind
to可以执行$sort
并重新分组。在此之后,我添加了一个新字段
count
,其中包含总金额,并且我使用$project
仅显示此字段。@J.F的回答让我接近了。以下是对我有效的查询:
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,
...
@J.F的回答让我很接近。以下是对我有效的查询:
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,
...
你能发布预期的输出吗?你能发布预期的输出吗?我运行了上面的程序,结果并不是很理想,但它让我很接近。此查询返回了`/*1/{“count”:[147.3148.3149150.315151.31552.3]}/2*/{“count”:[27.3,28.3,29.3,30.3,31.3,32.3,33.3,34.3,35.3,36.3,37.3,38.3]}……`。金额排序不正确(所有金额都应上升)。我将在下面单独发布答案。我运行了上面的操作,结果并不是很理想,但它让我接近了。此查询返回了``/*1/{“count”:[147.3148.31493、150.3151.3152.3]}/2*/{“count”:[27.3,28.3,29.3,30.3,31.3,32.3,33.3,34.3,35.3,36.3,37.3,38.3]}…`。金额排序不正确(所有金额都应该上升)。我将在下面单独发布答案。