4

次のようなドキュメントがあります。

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i3"
    }
}

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i5"
    }
}

私が必要とするのは、すべての params 値の数です。お気に入り:

brand
---------
BMW (2)

model
---------
i3 (1)
i5 (1)

map/reduce 関数を書かなければならないと思います。これどうやってするの?ありがとう。

4

2 に答える 2

2

map/reduce関数を書かなければならないと思います。

はい、これにはmap-reduceが必要です。いくつかの簡単なmap-reduceの例については、こちらをご覧ください

特定のケースでは、最初に出力の期待値を変更する必要があります。map/reduceの出力はコレクションです。コレクションは(あなたの場合)次のようになります。

{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }

このセットを生成するには、「map」関数と「reduce」関数が必要です。「マップ」関数は、キーと値を出力します。キーはparamsの各要素であり、値は1のカウントです。「reduce」関数はキーと値の配列を受け入れ、単一の値のみを返します。あなたの質問は基本的にMongoDBサイトのこの例と同じです:

map = function() {
    if (!this.params) {
        return;
    }
    for (index in this.params) {
        emit(this.params[index], 1);
    }
}

reduce = function(previous, current) {
    var count = 0;

    for (index in current) {
        count += current[index];
    }

    return count;
}
于 2010-12-27T07:21:46.743 に答える
1

map関数で、オブジェクトのparamsプロパティのプロパティを列挙しthisます。emitプロパティごとに、プロパティの名前とプロパティの値の両方を含むキーを使用して呼び出しを見つけます。値として1を渡します。たとえばemit({'brand','BMW'}, 1) 、定数ではなく変数を使用していることは明らかです。

reduce関数では、キーと値の配列が渡されます。これらの値を合計して、合計を返します。最初の配列はすべて1になりますが、reduce関数は繰り返し呼び出すことができるため、配列の長さを使用するように誘惑されることはありません。

後で結果コレクションから結果をグループ化し、パフォーマンスのために必要に応じてインデックスを適用できます。

于 2010-12-27T06:47:05.023 に答える