how to group in mongoDB and return all fields in result

后端 未结 5 573
梦如初夏
梦如初夏 2020-12-30 04:07

I am using aggregate method in mongoDB to group but when I use $group it returns the only field which I used to group. I have tried $project but it

相关标签:
5条回答
  • 2020-12-30 04:48

    user2683814's solution worked for me but in my case, I have a counter accumulator when we replace the newRoot object, the count field is missing in the final stage so I've used $mergeObjects operator to get my count field back.

    db.collection.aggregate([
     {
      $group: {
        _id: '$product',
        detail: { $first: '$$ROOT' },
        count: {
          $sum: 1,
        },
      },
    },
    {
      $replaceRoot: {
        newRoot: { $mergeObjects: [{ count: '$count' }, '$detail'] },
      },
    }])
    
    0 讨论(0)
  • 2020-12-30 04:56

    You can use this query

    db.col.aggregate([
                            {"$group" : {"_id" : "$name","data" : {"$first" : "$$ROOT"}}},
                            {"$project" : {
                                "tags" : "$data.tags",
                                "name" : "$data.name",
                                "rating" : "$data.rating",
                                "_id" : "$data._id"
                                }
                            }])
    
    0 讨论(0)
  • 2020-12-30 05:03

    You can use below aggregation query.

    $$ROOT to keep the whole document per each name followed by $replaceRoot to promote the document to the top.

    db.col.aggregate([
      {"$group":{"_id":"$name","doc":{"$first":"$$ROOT"}}},
      {"$replaceRoot":{"newRoot":"$doc"}}
    ])
    
    0 讨论(0)
  • 2020-12-30 05:04

    I wanted to group my collection by groupById field and store it as key value pairs having key as groupById and value as all the items of that group.

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

    This is working fine for me..

    0 讨论(0)
  • 2020-12-30 05:08

    When you group data on any database, it means you want to perform accumulated operation on the required field and the other field which will not be include in accumulated operation will be used in group like

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

    here in _id object will contains all other fields which you want to hold.

    for your data you can try this

    db.collection.aggregate([{
        $group: {
            _id: "$name",
            rating: { $first: "$rating" },
            tags: { $first: "$tag" },
            docid: { $first: "$_id" }
        }
    },
    {
        $project: {
            _id: "$docid",
            name: "$_id",
            rating: 1,
            tags: 1
        }
    }])
    
    0 讨论(0)
提交回复
热议问题