MongoDB聚合通用唯一键的总和和求和

时间:2015-10-22 02:17:33

标签: javascript mongodb mongodb-query aggregation-framework

假设我在经销商处出售汽车的文档中有一组对象:

{
 id: 'randomId',
 model: 'Jetta'
 carId: 'randomId',
 salesmanId: 'salesmenId3'
},
{
 id: 'randomId',
 model: 'Civic'
 carId: 'randomId',
 salesmanId: 'salesmenId2'
},
{
 id: 'randomId',
 model: 'Civic'
 carId: 'randomId',
 salesmanId: 'salesmenId2'
},
{
 id: 'randomId',
 model: 'S200'
 carId: 'randomId',
 salesmanId: 'salesmenId'
},
{
 id: 'randomId',
 model: 'Jetta'
 carId: 'randomId',
 salesmanId: 'salesmenId3'
},
{
 id: 'randomId',
 model: 'Civic'
 carId: 'randomId',
 salesmanId: 'salesmenId2'
},
...

我希望能够查询每位销售员的总车数以及每位销售员的唯一车型总数。

例如,如果我与' salesmenId2'匹配,我希望将其退回:

{
 salesmanId: 'salesmenId2',
 totalCars: 3,
 totalUniqueCars: 1
}

这是我到目前为止所做的:

$match: {'salesmanId':  'salesmenId2' },
      {
          $group: {
            _id: '$salesmanId',
            uniqueCars: { $addToSet: '$model'},
            totalCars: { $sum: 1 }
          }
      },
      {
          $unwind:"$uniqueCars"
      },
      {
          $group: {
            _id: "$_id",
            totalUniqueCars: { $sum:1}
          }
      }

现在只返回独特的汽车总数。知道我可能做错了吗?

1 个答案:

答案 0 :(得分:3)

您甚至不必使用$unwind,而是可以在“uniqueCars”数组字段上使用$size运算符,它实际上为您提供了数组的大小。

 db.cars.aggregate([
    {
        $match: { "salesmanId":  "salesmenId2" } 
    }, 
    {
        $group: {
                    _id: "$salesmanId",
                    uniqueCars: { $addToSet: "$model"},
                    totalCars: { $sum: 1 }
                }
    },
    { 
       $project : { 
                     _id : 1, 
                     totalCars : 1, 
                     uniqueCar : { $size : "$uniqueCars" }
                  }
    }
 ])