如何在 mongoDB 中分组并返回结果中的所有字段

新手上路,请多包涵

我在 mongoDB 中使用聚合方法进行分组,但是当我使用 $group 它返回我用来分组的唯一字段。我试过 $project 但它也不起作用。我还尝试了 $first 它有效,但结果数据现在采用不同的格式。

我需要的响应格式如下:

 {
    "_id" : ObjectId("5b814b2852d47e00514d6a09"),
    "tags" : [],
    "name" : "name here",
    "rating" : "123456789"
}

在我的 query.response 中添加 \(group 后,_id 的值会发生变化。 (并且 \)group 只使用 _id,如果我尝试任何其他关键字,它会引发累加器错误。请也解释一下。)

 {
    "_id" :"name here" //the value of _id changed to the name field which i used in $group condition
}

我必须删除名称字段中的重复项,而不更改任何结构和字段。我也将nodeJS与猫鼬一起使用,所以请提供适用于它的解决方案。

原文由 Anukool 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 631
2 个回答

您可以使用以下聚合查询。

$$ROOT 保留每个名称的整个文档,后跟 $replaceRoot 将文档提升到顶部。

 db.col.aggregate([
  {"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
  {"$replaceRoot":{"newRoot":"$doc"}}
])

原文由 s7vr 发布,翻译遵循 CC BY-SA 4.0 许可协议

user2683814 的解决方案对我有用,但就我而言,当我们替换 newRoot 对象时,我有一个计数器累加器,在最后阶段缺少计数字段,所以我使用了 $mergeObjects 运算符来取回我的计数字段.

 db.collection.aggregate([
 {
  $group: {
    _id: '$product',
    detail: { $first: '$$ROOT' },
    count: {
      $sum: 1,
    },
  },
},
{
  $replaceRoot: {
    newRoot: { $mergeObjects: [{ count: '$count' }, '$detail'] },
  },
}])

原文由 Sathish Kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题