1

次の構造のドキュメントがあります。

{
    "name" : "John",
    "items" : [
       {"key1" : "value1"},
       {"key1" : "value1"}
    ]
}

そして、「アイテム」の総数をカウントする簡単な関数を構築しました。

var count = 0;
db.collection.find({},{items:1}).limit(10000).forEach(
    function (doc) {
        if(doc.items){
               count += doc.items.length;
        }
    }
)
print(count);

しかし、約 100 万個のアイテムの後、関数が壊れ、Mongo が終了します。新しい集計フレームワークと mapreduce 関数を調べましたが、このような単純なカウントにどちらを使用するのが最適かわかりません。

提案を歓迎します! ありがとう。

4

2 に答える 2

-1

doc.items の長さを doc の要素として格納できます。この方法ではディスクの冗長性が生じますが、大規模なコレクションをすばやく簡単に処理できます。

{
    "name" : "John",
    "itemsLength" : 2,
    "items" : [
       {"key1" : "value1"},
       {"key1" : "value1"}
    ]
}

別のオプションは mapreduce を使用することかもしれませんが、シャーディングがないと mapreduce は遅くなると思います。

于 2012-12-28T07:52:29.453 に答える