Mongodb:$ group的_id中的嵌套字段

时间:2012-10-14 02:07:12

标签: mongodb

假设我们在集合中有这样的文件

{
    _id: {
        element_id: '12345',
        name: 'foobar'
    },
    value: {
        count: 1
    }
}

我正在使用聚合框架来执行$group,就像这样

db.collection.aggregate([
    { $group: { _id: '$_id.element_id', total: { $sum: '$value.count' } } }
])

得到了

的结果
{ "result" : [ { "_id" : null, "total" : 1 } ], "ok" : 1 }

请注意,结果中的_id字段为空。从实验开始,$ group似乎不允许其_id的嵌套字段声明(例如{{ 1}})。

这是为什么?它有解决方法吗?

谢谢。

2 个答案:

答案 0 :(得分:10)

我找到了使用$project的解决方法。

db.collection.aggregate([
    { $project: { element_id: '$_id.element_id', count: '$value.count' } },
    { $group: { _id: '$element_id', total: { $sum: '$count' } } }
])
  

$ project通过重命名,添加或删除字段来重塑文档流。

http://docs.mongodb.org/manual/reference/aggregation/#_S_project

答案 1 :(得分:3)

结果证明问题是SERVER-7491。它似乎已在2.2.2(大约3天前发布)中修复。

上面提到的解决方法在2.2.1中对我有用。需要注意的是,当使用$ project解决方法(2.2.2之前的版本)不包括来自带有_id:0的$项目中的_id时,由于看起来表现得很奇怪,所以我最终得到了一些正常工作,其中一些部分位于在同一聚合中的最终结果中缺少_id字段。