2013-05-29 58 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)。 –