按子文档字段分组文档

时间:2017-12-31 22:49:49

标签: mongodb mongodb-query aggregation-framework

我正在尝试使用mongo的聚合框架根据时间戳对集合进行分组,并使用$ out将其输出到新集合。道歉,我是Mongo的新手

我的集合中有以下JSON结构

-H

这是我一直在尝试的事情

{
    "_id" : "1",
    "parent" : [
        {
            "child" : {
                "child_id" : "1",
                "timestamp" : ISODate("2010-01-08T17:49:39.814Z")
            }
        }
    ]
}

然而得到这个错误。任何想法,我认为我可能错误地使用了该项目。

  

[thread1]错误:命令失败:{       " OK" :0,       " ERRMSG" :"群组汇总字段' cid'必须定义为对象内的表达式",       "代码" :15951   }:聚合失败:   _getErrorWithCode@src/mongo/shell/utils.js:25:13

2 个答案:

答案 0 :(得分:1)

db.collection.aggregate([
    {$group: { 
        _id: "$parent.child.child_id",
        timestamp: {$max: "$parent.child.timestamp"}
    }},
    {$project: {
        cid: {$arrayElemAt: ["$_id", 0]},
        ts: {$arrayElemAt: ["$timestamp", 0]},
        _id: 0
    }},
    {$out: "groupedCollection" }
])

您错过了$group管道阶段必需的_id。这是因为"父母"文档中的字段是一个元素数组,$group阶段应该是管道中的第一个阶段。

通过将$group阶段作为第一阶段,您只需要为每个组生成一个文档而不是集合中的所有文档。

请注意,生成的文档字段是数组,因此在$arrayElemAt阶段使用$project运算符。

答案 1 :(得分:0)

_id需要$group字段。此_id决定将哪些文档组合在一起。例如,如果您想按child_id进行分组,请执行_id: "$child_id"。在这种情况下,您可以省略cid字段(在这种情况下,您只需将cid更改为_id)。