MongoDB聚合:使用addToSet和sum

4

我找不到任何相关的例子,所以我不确定是否可能。我有以下文件:

db.mytest.insert([
    { date: new Date('2013-06-01'), 
      account: 'A', 
      ids: [ { id: '1vb', sale: 50 }, { id: 'xy2', sales: 25 } ]
    }, 
    { date: new Date('2013-06-02'), 
      account: 'A', 
      ids: [ { id: '1vb', sales: 10 }, { id: 'xy2', sales: 5 } ]
    } 
])

我将努力获得以下结果。
[{ account: 'A': 
   ids: [ { id: '1vb', salesAmount: 60, salesCount: 8 }, 
          { id: 'xy2', salesAmount: 30, salesCount: 3 } 
         ]
}]

我尝试了以下流程:
var unwind = { $unwind: '$ids' };
var group = { $group: { 
    _id: { id: '$ids.id' }, 
    ids: { $addToSet: 
            { 
              salesAmount: { $sum: '$ids.salesAmount' }, 
              salesCount: { $sum: '$ids.salesCount' }
            }
         }
 }};

db.mytest.aggregate([unwind, group])

但是它返回了这个错误。
Error: Printing Stack Trace
at printStackTrace (src/mongo/shell/utils.js:37:7)
at DBCollection.aggregate (src/mongo/shell/collection.js:897:1)
at (shell):1:11
Sun Jul  7 18:53:26.177 JavaScript execution failed: aggregate failed: {
    "errmsg" : "exception: invalid operator '$sum'",
    "code" : 15999,
    "ok" : 0
} at src/mongo/shell/collection.js:L898

你不需要使用addtoset。你只需要创建新的键,例如salesAmount: { $sum: '$ids.salesAmount' },salesCount: { $sum: '$ids.salesCount' }。 - innoSPG
我不认为这会得到我想要的结果@innoSPG。也许我错过了什么。你能提供一下管道的示例吗? - thadclay
1个回答

7

我用这个管道使得它可以工作了。

var unwind = { "$unwind" : "$ids" };
var group = {
"$group" : {
    "_id" : {
        "account" : "$account",
        "id" : "$ids.id"
    },
    "idSalesAmount" : {
        "$sum" : "$ids.salesAmount"
    },
    "idSalesCount" : {
        "$sum" : "$ids.salesCount"
    }
}};
var group2 = {
"$group" : {
    "_id" : "$_id.account",
    "ids" : {
        "$addToSet" : {
            "id" : "$_id.id",
            "salesAmount" : "$idSalesAmount",
            "saleCount" : "$idSalesCount"
        }
    }
}};
var project = { "$project" : { "account" : "$_id", "ids" : 1, "_id" : 0 } };

db.mytest.aggregate([unwind, group, group2, project])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接