Mongodb mongo db映射将总和结果缩减为整数
我的收藏好像是这样的Mongodb mongo db映射将总和结果缩减为整数,mongodb,mongodb-query,Mongodb,Mongodb Query,我的收藏好像是这样的 { "bet_session_id": ObjectId("51a60cba6ef215d019000299"), "date": ISODate("2013-05-29T14:13:14.572Z"), "player_items": [ { "chip": NumberInt(1), "item": "x14", "ratio": NumberInt(35), "total_win": NumberInt(0) }, { "chip": Number
{
"bet_session_id": ObjectId("51a60cba6ef215d019000299"),
"date": ISODate("2013-05-29T14:13:14.572Z"),
"player_items": [
{
"chip": NumberInt(1),
"item": "x14",
"ratio": NumberInt(35),
"total_win": NumberInt(0)
},
{
"chip": NumberInt(1),
"item": "x15",
"ratio": NumberInt(35),
"total_win": NumberInt(36)
},
{
"chip": NumberInt(1),
"item": "121511141013",
"ratio": NumberInt(5),
"total_win": NumberInt(6)
},
],
"user_id": "7876010",
}
,
{
"bet_session_id": ObjectId("51a60cba6ef215d019000299"),
"date": ISODate("2013-05-29T14:13:14.572Z"),
"player_items": [
{
"chip": NumberInt(1),
"item": "x14",
"ratio": NumberInt(35),
"total_win": NumberInt(0)
},
{
"chip": NumberInt(1),
"item": "x15",
"ratio": NumberInt(35),
"total_win": NumberInt(36)
},
{
"chip": NumberInt(1),
"item": "121511141013",
"ratio": NumberInt(5),
"total_win": NumberInt(6)
},
{
"chip": NumberInt(1),
"item": "12151114",
"ratio": NumberInt(8),
"total_win": NumberInt(9)
},
{
"chip": NumberInt(1),
"item": "1514",
"ratio": NumberInt(17),
"total_win": NumberInt(18)
},
{
"chip": NumberInt(1),
"item": "1215",
"ratio": NumberInt(17),
"total_win": NumberInt(18)
},
{
"chip": NumberInt(1),
"item": "151814171316",
"ratio": NumberInt(5),
"total_win": NumberInt(6)
},
{
"chip": NumberInt(1),
"item": "151413",
"ratio": NumberInt(11),
"total_win": NumberInt(12)
},
{
"chip": NumberInt(1),
"item": "15181417",
"ratio": NumberInt(8),
"total_win": NumberInt(9)
}
],
"user_id": "9034906623",
}
使用上述数据
我需要计算玩家的总胜利
我的map reduce函数如下所示:
var mapBetPlayWinStats = function() {
for (i=0; i<this.player_items.length; i++ ) emit( this.player_items[i].item, this.player_items[i].total_win )};
var reduceBetPlayWinStats = "function(item,values) { var sum = 0; sum += values; return sum; }"
db.bet_results.mapReduce(mapBetPlayWinStats, reduceBetPlayWinStats, {out: "bet_number_play_win_stats"});
RESULTS:
{
"_id": "red",
"value": "20,50,20,NumberLong(20),NumberLong(20),100"
}
{
"_id": "odd",
"value": "NumberLong(0),NumberLong(0)"
}
{
"_id": "even",
"value": "0,20,NumberLong(20),NumberLong(20)"
}
var mappetplaywinstats=function(){
对于(i=0;i而言,以下对我有效:
在映射函数中,将发射更改为
emit( this.player_items[i].item, NumberInt(this.player_items[i].total_win) )};
在您的账户中,将变更金额减少为:
var sum = NumberInt(0);
现在测试它:
> db.bet_number_play_win_stats.find({value:{$type:16}})
{ "_id" : "121511141013", "value" : 6 }
{ "_id" : "x14", "value" : 0 }
{ "_id" : "x15", "value" : 36 }
Fetched 3 record(s) in 1ms
16(十六进制10)是最简单的
如果要聚合的项目数量不太多,我建议您使用聚合框架:
> var r=db.bet_results.aggregate( [
{$unwind : "$player_items"},
{$group: { _id:"$player_items.item",
wins:{$sum:"$player_items.total_win"}
}
}
] )
> db.bet_number_play_win_agg.save(r.result)
Inserted 1 record(s) in 7ms
> > db.bet_number_play_win_agg.find({wins:{$type:16}})
{ "_id" : "121511141013", "wins" : 6 }
{ "_id" : "x15", "wins" : 36 }
{ "_id" : "x14", "wins" : 0 }
Fetched 3 record(s) in 1ms
相同的结果,类型保留,速度也更快。我不确定我是否理解,你的结果中的“红色”、“奇数”和“偶数”来自哪里?你想要的结果是什么?按项目分组的总赢款?我猜这些都是OP的原始数据集?反正这是我的猜测-跟踪下注+“红色”、“奇数”、“偶数”==>轮盘赌?:)@Joackim,item可以是“item”:“x14”或“item”:“red”并不重要,这只是一个示例。我需要按项分组。谢谢:)聚合ok,但map reduce仍然无法正常工作。这是NumberRint()解决方案的结果。结果{“\u id”:“x1”,“value”:NumberRint(0)}{“\u id”:“x0”,“value”:“00,0”}{“\u id”:“red,“value”:“00,0,20,50,20,20,20100,0,20,20,20,0,0,20100”}这是因为您的reduce函数不正确。您将值添加到sum中,但值是一个数组-您需要将其中的所有内容添加到一起(并添加到sum中)。