2013-05-29 57 views
0

我的藏品看起来这蒙戈DB地图降低和结果作为整数

{ 
"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", 
} 

使用 我需要计算玩家总胜

和我的地图缩小功能上述数据是在这里:

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)" 
} 

我想我的地图减少功能是正确的,但我需要总结价值项目为整数。 我也尝试parseInt()和新的NumberLong()函数。

+0

我不确定自己明白,结果中“红色”,“奇怪”和“偶数”来自哪里?你期望的结果是什么?总分是按项目分组的? –

+0

我猜这些来自OP的原始数据集?无论如何,这是我的猜测 - 跟踪投注+'红','奇','甚至'==>轮盘赌? :) –

+0

@Joackim,项目可以是“item”:“x14”或“item”:“red”无所谓这只是一个例子。我需要逐项分组。 –

回答

2

对我来说,以下工作:

在你的地图功能,改变你的射向

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 

1 6(十六进制10)是type for 32-bit integer in bson

如果您正在聚集项的数量不是太大,我会建议考虑使用聚合框架:

> 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 

同样的结果,保存类型,更快了。

+0

+1表示两种方式:) –

+0

**谢谢..:)** **聚合确定,但地图缩小仍然无法正常工作。** **这是您的numberInt()解决方案的结果。 ** 结果 { “_id”: “X1”, “值”:NumberInt(0) } { “_id”: “X0”, “值”: “00,0” } { “_id”:“red”, “value”:“00,0,20,50,20,20,20,100,0,20,20,0,0,20,100” } –

+0

这是因为您的减少功能不正确。你正在增加值来求和,但值是一个数组 - 你需要把所有的东西加在一起(并加上sum)。 –