2

私が取り組んでいるアプリケーションでは、10 ~ 1,000,000 アイテム程度の大量のセット交差を行う必要があります。交差しているアイテムは、単に ObjectId のものです。

たとえば、box ドキュメントがあり、box ドキュメント内に item_ids Array があります。各ボックスのこの item_ids 配列には、10 ~ 1,000,000 個の ObjectId が保持されます。

ここでの最終目標は、ObjectId 4d3dc3898951498107000005 のボックス A と ObjectId 4d3dc3898951498107000002 のボックス B が与えられた場合、どの item_id が共通しているかということです。

これが私がそれをしている方法です:

db.boxes.distinct("item_ids", {'_id' : {$in : [ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}})

まず、これが正気なアプローチのように見えるかどうかに興味があります。これまでの私の調査では、大規模な交差点では map reduce が一般的に提案されているようですが、リアルタイム クエリにはお勧めできません。

次に、シャード環境でこれがどのように動作するか興味がありますか? mongos は必要な mongod でクエリのチャンクを実行し、私の結果を魔法のように集計しますか?

最後に、上記が正気である場合、次のことも正気ですか。

db.items.find({'_id' : { $in : db.eval(function() {return db.boxes.distinct("item_ids", {_id:{$in:[ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}}); }) }}) 

これは基本的に、ボックス A とボックス B の両方に共通するアイテムを見つけ、それらをすべて 1 つのサーバー側クエリでオブジェクトに具体化することです。これは、データ セットのページングを効果的に実装するために、.limit および .skip とも連携しているようです。

とにかく、どんなフィードバックも貴重です、ありがとう!

4

1 に答える 1

3

スキーマを再考することをお勧めします。12 バイトの配列に 1,000,000 個の ObjectID がある場合、これは 12 MB であり、大きな配列の場合に重要になる可能性のある BSON オーバーヘッドをカウントしません* (おそらくさらに 8 MB 程度)。1.8 では、ドキュメントの最大サイズを 4MB から 16MB に引き上げていますが、それでも保存しようとしているオブジェクトには十分ではありません。

*歴史的な理由から、要素数が 100 未満の場合は問題ありませんが、6 桁または 7 桁が必要な場合は、配列内の各要素の文字列化されたインデックスを格納します。

于 2011-01-26T19:56:53.713 に答える