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]}…`。金额排序不正确(所有金额都应该上升)。我将在下面单独发布答案。