结合 $project、$unwind 和 $group 的查询

Tho*_*mar 3 mongodb aggregation-framework

我有以下数据集:

{
  "_id" : ObjectId("57684f2b61f2af6d49fa6dbd"),
  "firstname" : "First1",
  "surname" : "Sur1",
  "email" : "first1@sur1.com",
  "goals" : [ 
    {
        "gId" : "base1",
        "recordDate" : ISODate("2016-06-21T20:05:48.972Z")
    }, 
    {
        "gId" : "base2",
        "recordDate" : ISODate("2016-06-21T20:05:48.972Z")

    }, 
    {
        "gId" : "base1",
        "recordDate" : ISODate("2016-06-21T20:05:48.972Z")

    }
 ]
}
Run Code Online (Sandbox Code Playgroud)

我需要以下结果:

{
  "_id" : ObjectId("57684f2b61f2af6d49fa6dbd"),
  "firstname" : "First1",
  "surname" : "Sur1",
  "email" : "first1@sur1.com",
  "goals" : [
    {
       "gId" : "base1",
       "count" : 2
    },
    {
       "gId" : "base2",
       "count" : 1
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我使用了聚合查询,但找不到解决问题的方法。我的查询看起来像那样,但它不起作用。第一个位$project本身运行良好,也是如此$unwind$group但我不知道如何将它组合在一起。

db.getCollection('users').aggregate(
{
  $project : {
    firstname: "$firstname",
    surname: "$surname",
    email: "$email",
    goals: "$goals"
  }
},
{ 
  $unwind: '$goals' 
},
{ 
  $group: {
    gid: '$goals.gId',
    count: {'$sum': 1}
  }
}
)
Run Code Online (Sandbox Code Playgroud)

提前致谢,汤姆

DAX*_*lic 5

尝试使用以下管道

db.getCollection('users').aggregate(
    { 
      $unwind: '$goals' 
    },
    { 
      $group: {
        _id: {
            firstname: "$firstname",
            surname: "$surname",
            email: "$email",
            gId: "$goals.gId"
        },
        count: {'$sum': 1}
      }
    },
    {
        $group: {
            _id: {
                firstname: "$_id.firstname",
                surname: "$_id.surname",
                email: "$_id.email"
            },
            goals: {
                $push: {
                    gId: "$_id.gId",
                    count: "$count"
                }
            }        
        }
    },
    {
        $project: {
            _id: 0,
            firstname: "$_id.firstname",
            surname: "$_id.surname",
            email: "$_id.email",
            goals: 1
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样

{
    "goals" : [ 
        {
            "gId" : "base2",
            "count" : 1.0
        }, 
        {
            "gId" : "base1",
            "count" : 2.0
        }
    ],
    "firstname" : "First1",
    "surname" : "Sur1",
    "email" : "first1@sur1.com"
}
Run Code Online (Sandbox Code Playgroud)