2012-03-10 6 views
0

mongodbの内部ドキュメントのマップ/縮小ソートに関する質問があります。ネストされたドキュメントのマップ/縮小とソート

{ 
    "_id" : 16, 
    "days" : { 
     "1" : 123, 
     "2" : 129, 
     "3" : 140, 
     "4" : 56, 
     "5" : 57, 
     "6" : 69, 
     "7" : 80 
} 

をだから私の質問は今: どのように私は上記のデータからいくつかの特定の日を合計する達成することができます スキームは、以下のようなものです。 例:

私は1,3日目と7日目の値を合計し、その結果を得たいと思います。 私は MapReduce aggregation based on attributes contained outside of documentから解決策を試しましたが、それで成功しませんでした。

誰かが私を助けることができますか?

答えて

3

MapReduceは、多数のドキュメントをループして操作を実行する操作です。私はそれがまさにあなたが望むものだとはっきりしていませんが、実際の問題のよりシンプルな形を投稿している可能性があります。いずれにしても、次のコードは、ドキュメントの_idをreduce関数のキーとして使用して、単一のドキュメントに対して3回発光して動作します。

doc = {_id : 16, days : { 1 : 123, 2 : 129, 3 : 140, 4 : 56, 5 : 57, 6 : 69, 7 : 80 }}; 
db.so.insert(doc); 

map = function() { 
    emit(this._id, this.days["1"]); 
    emit(this._id, this.days["3"]); 
    emit(this._id, this.days["7"]); 
} 

reduce = function (k, vals) { 
    var sum = 0; 
    vals.forEach(function (v) {sum += v;}); 
    return sum; 
} 

res = db.so.mapReduce(map, reduce, {out : {inline : 1}}); 
res.find(); 
+0

ご回答ありがとうございます。しかし、私はこれを試して、私はコンパイルエラーがある。私はモンゴーが「this.days.1」を好まないと思う。 – MadeOfSport

+1

申し訳ありません、私はそれを修正しました。答えに間違ったバージョンを貼り付けた!あなたが答えを見つけるのが難しいと思ったのはおそらくthis.days.1は動作しませんが、this.days ["1"]はそうです。 –

関連する問題