2014-06-07 215 views
1

在過去的幾個小時裏,我一直在碰撞着這個東西,不能把頭繞在裏面。也許有人可以幫忙。我收集了以下內容。mongodb組和總和?

{ 
    "smallparts": [ 
     { "quantity": "10", "part": "test1" }, 
     { "quantity": "10", "part": "test2" } 
    ] 
}, 
{ 
    "smallparts": [ 
     { "quantity": "10", "part": "test3" } 
    ] 
}, 
{ 
    "smallparts": [ 
     { "quantity": "10", "part": "test1" }, 
     { "quantity": "10", "part": "test2" } 
    ] 
} 

當嘗試以下添加數量我不能正確。

collection.aggregate( 

    // Unwind the array 
    { "$unwind":"$smallparts" }, 

    // Group the products 
    { 
     "$group": 
     { 
     "_id": 
     { 
      "part": "$smallparts.part", 
      "total": "$smallparts.quantity", 
     } 
     }, 
    }, 

我的輸出是這是錯誤的。 TEST1和TEST2應該是20

{ 
"data": [ 
    { 
     "_id": { 
      "part": "test3", 
      "total": "10" 
     } 
    }, 
    { 
     "_id": { 
      "part": "test2", 
      "total": "10" 
     } 
    }, 
    { 
     "_id": { 
      "part": "test1", 
      "total": "10" 
     } 
    } 
] 

}

我也試過,但得到一個空數組。

collection.aggregate(
//放鬆陣列 { 「$開卷」: 「$ smallparts」},

// Group the products 
{ 
    "$group": 
    { 
    "_id": 
    { 
     "part": "$smallparts.part", 
     "total": "$smallparts.quantity", 
     sum: { $sum: "$smallparts.quantity" } 
    } 
    }, 

感謝您的幫助

回答

2

問題你所面對的是你不能使用$sum和字符串,你需要將你的數量轉換爲整數才能使這個查詢正常工作

獲得所有總的分組的總和一部分,當數量爲整數的方式:

db.coll.aggregate([ 
    { $unwind : "$smallparts"}, 
    { $group : { 
     _id : "$smallparts.part" , 
     sum : { $sum : "$smallparts.quantity" } 
    } 
}]); 

如果你有在DB模式控制,這將是推薦的方法。

第二種方法是使用來重寫查詢地圖,減少在那裏你可以使用JavaScript功能,如parseInt將值轉換:

var mapFunction = function() { 
    for (var idx = 0; idx < this.smallparts.length; idx++) { 
     emit(this.smallparts[idx].part, this.smallparts[idx].quantity); 
    } 
}; 

var reduceFunction = function(key, vals) { 
    var sum = 0; 
    for (var idx = 0; idx < vals.length; idx++) { 
     sum += parseInt(vals[idx]); 
    } 
    return sum; 
}; 

db.coll.mapReduce(mapFunction, reduceFunction, { out : "my_mapreduce_res"}); 

你的map-reduce結果將被存儲在my_mapreduce_res收藏。