7

次のようなドキュメントのコレクションがあります。

{
    "_id" : ObjectId("..."),
    "field1": "some string",
    "field2": "another string",
    "field3": 123
}

コレクション全体を反復処理して、そこにあるフィールドの総数を見つけたいと思います。この例のドキュメントには 3 つ (_id は含めたくありません) ありますが、ドキュメント内のフィールドの範囲は 2 から 50 です。最終的には、ドキュメントあたりのフィールドの平均数を探しているだけです。

何か案は?

4

4 に答える 4

4
PRIMARY> var count = 0;
PRIMARY> db.my_table.find().forEach( function(d) { for(f in d) { count++; } });
PRIMARY> count
1074942

これは、これを行う方法を理解できる最も簡単な方法です。非常に大規模なデータセットでは、Map-Reduce パスを使用することはおそらく理にかなっています。ただし、セットが十分に小さい場合は、これで十分です。

これはO(n^2)ですが、より良い方法があるかどうかはわかりません。

于 2012-12-11T00:34:39.290 に答える
2

Map-Reduce ジョブを作成できます。Map ステップで、各ドキュメントのプロパティを javascript オブジェクトとして反復処理し、カウントを出力して合計を取得します。

于 2012-12-11T00:03:07.177 に答える
0

簡単な方法では、すべての値を find() し、レコードのセットごとに配列のサイズを取得します。

db.getCollection().find(<condition>)

次に、結果の各セットについて、配列のサイズを取得します。

sizeOf(Array[i])
于 2015-12-14T09:40:31.953 に答える