4

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

{
    _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(例如$_id.element_id)进行嵌套字段声明。

为什么是这样?是否有解决方法?

谢谢你。

4

2 回答 2

12

我找到了使用$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

于 2012-10-14T02:28:34.033 回答
3

原来这是问题SERVER-7491。它似乎已在 2.2.2 中修复(大约 3 天前发布)。

上面提到的解决方法在 2.2.1 中对我来说效果很好。请注意,当使用 $project 解决方法(2.2.2 之前)时,不建议将 _id 从具有 _id:0 的 $project 中排除,因为它的行为似乎很奇怪,我最终得到了一些正常工作和一些在该部分在同一聚合中的最终结果中缺少 _id 字段。

于 2012-11-30T23:40:49.893 回答