我正在尝试使用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
答案 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
)。