1

mongoを開始したばかりで、すでにクエリに問題が発生し始めています。「externalTransaction」というコレクションがあり、この mysql クエリに相当するものを書きたいと考えています。

select transactionCode, 
       sum(amount) as totalSum, 
       count(amount) as totalCount 
from externalTransaction 
where transactioncode in ('aa','bb','cc') 
group by sum(amount)

以下は私の試みです:

{
 "collectionName": "externalTransaction",
  sort: {transactionCode:-1},
  query: {this._id: {$in:['aa','bb','cc']}},
  mapReduce:{
   'map': 'function(){

        emit(this.transactionCode, this.amount);

   }',
 'reduce': 'function(key, values){
    var result = {count: 0, sum: 0.0};

    values.forEach(function(value) {
      result.count++
       result.sum += value.amount;
    });
    return result;
 }',
   'out' : 'sumAmount'
 }

}

上記のクエリでは、次のような結果セットが得られます。

_id     value.count        value.sum
ct      2.0                NaN
bb      40.0           NaN
fg      71.0           NaN
fd      36.0           NaN
sd      5.0                NaN
as      4.0            NaN
aa      71.0           NaN
df      4.0                NaN
cc      10.0               NaN

バージョンのドキュメントから、2.0.6私はまだ使用できないaggregation frameworkので、私のような単純なクエリをmongoで処理する方法. 読んでくれてありがとう、そして私の質問の些細なことを許してください。

4

1 に答える 1

2

mapand関数にいくつかのエラーがありreduceます。まず、map単純な数値を発行し、reduce で数値を取得しようとしますamount。きっと、その性質はありません。第 2 に、 と の出力は一様mapreduceなければなりませんreduce。次の機能を試してください。

var map = function() {
  emit(this.transactionCode, {sum: this.amount, count: 1})
}

var reduce = function(k, vals) {
  var result = {sum: 0, count: 0};

  vals.forEach(function(v) {
    result.sum += v.sum;
    result.count += v.count;
  });
  return result;
}
于 2012-06-26T16:34:05.847 に答える