Mongo组在$ addToSet里面

时间:2015-08-07 18:41:47

标签: mongodb

我有以下一组对象:

 [
    {
      id: 1,
      clientId: 1,
      cost: 200
    },
    {
      id: 1,
      clientId: 2,
      cost: 500
    },
    {
      id: 1,
      clientId: 2,
      cost: 800
    },
    {
      id: 2,
      clientId: 1,
      cost: 600
    },
    {
      id: 2,
      clientId: 2,
      cost: 100
    }
]

我用以下内容制作了一组:

db.collection.aggregate(
   {
     '$group': {
        '_id': '$id',
        'clients': {
           '$addToSet': {
              'id': '$clientId',
              'cost': '$cost'
            }
        }
      }
   }
)

所以我考虑了以下内容:

[
    {
        '_id': 1,
        'clients': [
            {
                id: 1,
                cost: 200
            },
            {
                id: 2,
                cost: 500
            },
            {
                id: 2,
                cost: 800
            }
        ],
        '_id': 2,
        'clients': [
            {
                id: 1,
                cost: 600
            },
            {
                id: 2,
                cost: 100
            }
        ]
    }
]

正如你在第一个值的客户数组中看到的那样,我有2个重复,我想要的是增加1个成本。所以没有:

'clients': [
                {
                    id: 1,
                    cost: 200
                },
                {
                    id: 2,
                    cost: 500
                },
                {
                    id: 2,
                    cost: 800
                }
            ]

我需要:

'clients': [
                {
                    id: 1,
                    cost: 200
                },
                {
                    id: 2,
                    cost: 1300
                }
            ]

所以我的问题是:我怎么能这样做?因为$ addToSet和$ push允许$ sum。

1 个答案:

答案 0 :(得分:0)

您可以使用aggregation operators获得预期的输出,如下所示:

db.collection.aggregate({
    "$group": {
    "_id": {
        "mainId": "$id",
        "client": "$clientId"
    },
    "cost": {
        "$sum": "$cost"
    }
    }
}, {
    "$project": {
    "mainId": "$_id.mainId",
    "clients": {
        "clientId": "$_id.client",
        "cost": "$cost"
    },
    "_id": 0
    }
}, {
    "$group": {
    "_id": "$mainId",
    "clients": {
        "$push": "$clients"
    }
    }
})