2013-07-07 165 views
3

我找不到任何這樣的例子,所以我不知道這是否可能。我有以下文件mongodb聚合addToSet與總和

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 
+0

你不需要addtoset。你只需要用salesAmount之類的數字創建新的密鑰:{$ sum:'$ ids.salesAmount'},salesCount:{$ sum:'$ ids.salesCount'} – innoSPG

+0

我不認爲這會得到結果我想要@innoSPG。也許我錯過了它。你能提供一個管道的例子嗎? – thadclay

回答

4

I得到它與這條管道一起工作。

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])