0

私のコレクションはこんな感じ

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

私のmap reduce関数は正しいと思いますが、値の項目を整数として合計する必要があります。私も parseInt() と new NumberLong() 関数を試しました。

4

1 に答える 1

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

16 (Hex 10) は、bson の 32 ビット整数の型です

集約されるアイテムの数が多すぎない場合は、集約フレームワークの使用を検討することをお勧めします。

> 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

同じ結果、型が保持され、高速です。

于 2013-05-29T15:42:41.283 に答える