4

使用しているMongoDBの説明的な「スキーマ」(quelle horreur)を準備しています。

優れたvariety.jsを使用して、すべてのキーのリストを作成し、各キーのカバレッジを表示しました。ただし、キーに対応する値の値のセットが少ない場合は、セット全体を「使用可能な値」としてリストできるようにしたいと思います。Rでは、これらをカテゴリ変数の「要因」、つまり性別:["M"、"F"]と考えています。

R + RMongoを使用して各変数をクエリし、基本的にヒストグラムを作成するのと同じ手順を実行できることはわかっていますが、適切なMongo.query()/ javascript / Map、Reduceのアプローチ方法を知りたいですこれ。db.collection.aggregate()関数がまさにこのために設計されていることを理解しています。

これを尋ねる前に、私は参照しました:

しかし、パイプラインの順序を正しく取得することはできません。したがって、たとえば、次のようなドキュメントがある場合:

{_id : 1, "key1" : "value1", "key2": "value3"}
{_id : 2, "key1" : "value2", "key2": "value3"}

次のようなものを返したいのですが。

{"key1" : ["value1", "value2"]}
{"key2" : ["value3"]}

またはそれ以上、カウント付き:

{"key1" : ["value1" : 1, "value2" : 1]}
{"key2" : ["value3" : 2]}

これを行う際の問題の1つは、さまざまな値を持つ値、つまりテキストフィールド、または連続変数であると認識しています。理想的には、可能な値がx個を超える場合は、切り捨てて、たとえば20個以下の一意の値にすることをお勧めします。それが実際にはもっと多いことがわかった場合は、その変数を直接照会します。

これは次のようなものですか?

db.collection.aggregate(
   {$limit: 20,
    $group: {
        _id: "$??varname",
        count: {$sum: 1}
   }})

まず、どうすれば?? varnameを参照できますか?各キーの名前は?

私はそれの95%を持っているこのリンクを見ました: Mongoでのビニングと集計(一意/カウント)

と...

input data:

{ "_id" : 1, "age" : 22.34, "gender" : "f" }
{ "_id" : 2, "age" : 23.9, "gender" : "f" }
{ "_id" : 3, "age" : 27.4, "gender" : "f" }
{ "_id" : 4, "age" : 26.9, "gender" : "m" }
{ "_id" : 5, "age" : 26, "gender" : "m" }

このスクリプト:

db.collection.aggregate(
   {$project: {gender:1}},
   {$group: {
        _id: "$gender",
        count: {$sum: 1}
   }})

生産:

{"result" : 
   [
     {"_id" : "m", "count" : 2},
     {"_id" : "f", "count" : 3}
   ],
   "ok" : 1
}

しかし、私が理解していないのは、戻り値の数が潜在的に多い未知の数/名前のキーに対して、これを一般的にどのように行うことができるかということです。このサンプルは、キー名が性別であり、応答セットが小さい(2つの値)ことを認識しています。

4

1 に答える 1

1

コレクション内のすべてのキーの名前を出力するスクリプトを既に実行している場合は、集計フレームワーク パイプラインを動的に生成できます。つまり、variable.js タイプのスクリプトを拡張するか、独自のスクリプトを作成するだけです。

「_id」以外の名前付きフィールドがいくつかある「キー」と呼ばれる配列が渡された場合、JS では次のようになります (トップレベルのフィールドを想定しており、配列や埋め込みドキュメントなどは気にしないことを前提としています)。 .

keys = ["key1", "key2"];
group = { "$group" : { "_id" : null } } ;
keys.forEach( function(f) {
     group["$group"][f+"List"] = { "$addToSet" : "$" + f };  } );
db.collection.aggregate(group);
{
    "result" : [
        {
            "_id" : null,
            "key1List" : [
                "value2",
                "value1"
            ],
            "key2List" : [
                "value3"
            ]
        }
    ],
    "ok" : 1
}
于 2013-04-28T21:47:08.743 に答える