获取原始文档字段作为汇总结果的一部分

网络袋熊

我想在汇总结果中获取所有文档字段,但是一旦我使用$ group,它们就消失了。使用$ project允许我读取$ group中定义的任何字段,但是不能获取其他字段:

var doc = {
  _id: '123',
  name: 'Bob',
  comments: [],
  attendances: [{
    answer: 'yes'
  }, { 
   answer: 'no'
  }]       
}

aggregate({
    $unwind: '$attendances'
  }, {
    $match: {
      "attendances.answer": { $ne:"no" }
    }
  }, {
    $group: {
    _id: '$_id',
    attendances: { $sum: 1 },
    comments: {  $sum: { $size: { $ifNull: [ "$comments", [] ] }}}
  } 
}, {
  $project: {
    comments: 1,
  }
}

结果是:

[{
  _id: 5317b771b6504bd4a32395be,
  comments: 12 
},{
  _id: 53349213cb41af00009a94d0,
  comments: 0 
}]

我如何在其中获得“姓名”?我尝试将$ group添加为:

name: '$name'

以及$ project中:

name: 1

但都行不通

斯坦尼

您无法投影在$group操作过程中删除的字段

由于您是按原始文档分组的_id,因此只有一个name值,因此您可以name使用保留字段$first

db.sample.aggregate(
    { $group: {
        _id: '$_id',
        comments: {  $sum: { $size: { $ifNull: [ "$comments", [] ] }}},
        name: { $first: "$name" }
    }}
)

输出示例如下:{“ _id”:“ 123”,“ comments”:0,“ name”:“ Bob”}

如果按条件分组,其中可能要保留多个值,那么您应该$push对中的数组进行分组,$group或者$addToSet如果只希望使用唯一名称,请使用。

投影所有领域

如果您使用的是MongoDB 2.6,并且想要获取所有原始文档字段(而不仅仅是name)而不单独列出它们,则可以使用聚合变量$$ROOT代替特定的字段名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章