2011-11-21 9 views
30

私はMongoDBが多くのリクエスト/秒を処​​理できることを知っていますが、_idを与えられたコレクションのドキュメントをたくさん問い合わせなければならないとしましょう。どのようにうまくいくのでしょうか?_id属性を取得したいすべてのID、またはfindOneクエリをループして_id属性を$にするか?

答えて

32

私は間違いなく$ inクエリを使用し、_idsの配列を提供します。

例:

db.collection.find({ 
    "key": { 
     "$in": [ 
      ObjectId("xxx"), 
      ObjectId("yyy"), 
      ObjectId("zzz") 
     ] 
    } 
}) 

なぜ?

  • ループすると、オーバーヘッドを発生させる各クエリ作成カーソルおよび消耗カーソルに対して一定のセットアップとティアダウンがあります。
  • これをローカルマシンで実行していない場合は、すべての要求に対してtcp/ipオーバーヘッドも作成されます。ローカルでは、ドメインソケットを使用できます。
  • デフォルトで "_id"のインデックスが作成され、バッチリクエストで返されるドキュメントのグループを収集するのは非常に高速であるため、これを小さなクエリに分割する必要はありません。

チェックアウトしたい場合は、hereという追加のドキュメントがあります。

+8

$の中にたくさんの項目があるとしたら... 100か1,000か? – ewindsor

+0

@windsor 1000までは大丈夫です。その後、私はあなたが持っているスキーマを再考し、データの事前計算を開始します。 –

+1

JSONオブジェクトの配列に '$ in'を使用できますか? –