もちろん、$in
クエリで使用するIDの数が増えるにつれて、問題が増えます。私たちは数千のIDの配列を使ってクエリの実行時間を大幅に短縮しました。あなたはMongoDBのシェルでexplain()機能を使用して(またはラップクエリを使用)して、クエリの実行中にスキャンされているどのように多くのドキュメントを参照することができます
:スキャンした文書の
{"$query" : {"foo" : "bar"}, "$explain" : true}
数の近くに配置してくださいできるだけ返される文書の数。
他の人には便利かもしれない一般的なメモ - $in
クエリがまったく必要ない場合もあります。 1つを多数のリレーションにリバースすると、クエリを簡素化できます。あなたの代わりに、以下の構造を有するのユーザーに好まれた曲を、検索する場合たとえば、:
user :
{
'likes' : [
ObjectId(song_id1),
ObjectId(song_id2),
...
]
}
あなたが持つことができます。
song :
{
'likedBy' : [
ObjectId(user_id1),
ObjectId(user_id2),
...
]
}
を次に、あなただけのために{'likedBy' : ObjectId(yourUserId)}
曲を照会することができます(MongoDBは配列内のidを探します)。もちろん状況によって異なりますが、この例は簡単ですが、リレーションを逆にしたり、データの冗長性を追加するなどしてクエリを高速化することができます。
コレクションに何千ものドキュメントがある場合はどうすればよいですか?それは遅いでしょうか? – guiomie
何百もOKです。何千人もOKです。数十万はないでしょう。私は〜300Kのドキュメントのデータベースで同じ問題を抱えていましたが、インデックスでさえ、特に一致するIDSのリストが長い – ibtarek