私が取り組んでいるアプリケーションでは、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 とも連携しているようです。
とにかく、どんなフィードバックも貴重です、ありがとう!