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

时间:2018-09-29 09:16:05

标签: node.js mongodb mongoose aggregation-framework

我在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和mongoose一起使用,因此请提供适用于它的解决方案。

5 个答案:

答案 0 :(得分:5)

您可以使用以下汇总查询。

$$ROOT保留每个名称的整个文档,然后使用$replaceRoot保留该文档的顶部。

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

答案 1 :(得分:2)

在任何数据库上对数据进行分组时,这意味着您要在必填字段上执行累加操作,而不会包括在累加操作中的其他字段将以类似方式使用

 db.collection.aggregate([{
 $group: {
   _id: { field1: "", field1: "" },
   acc: { $sum: 1 }
 }}]

_id对象中的此处将包含您要保留的所有其他字段。

对于您的数据,您可以尝试

db.collection.aggregate([{
    $group: {
        _id: "$name",
        rating: { $first: "$rating" },
        tags: { $first: "$tag" },
        docid: { $first: "$_id" }
    }
},
{
    $project: {
        _id: "$docid",
        name: "$_id",
        rating: 1,
        tags: 1
    }
}])

答案 2 :(得分:1)

您可以使用此查询

db.col.aggregate([
                        {"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
                        {"$project" : {
                            "tags" : "$data.tags",
                            "name" : "$data.name",
                            "rating" : "$data.rating",
                            "_id" : "$data._id"
                            }
                        }])

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我想按groupById字段对集合进行分组,并将其存储为键值为groupById且键值为该组所有项的键值对。

db.col.aggregate([{$group :{_id :"$groupById",newfieldname:{$push:"$"}}}]).pretty()

这对我来说很好。