配列に約 50 個のリストがありtags
、ドキュメントを検索してこれらのタグに一致するレコードを見つけたいと考えています。
ユーザーが送信したもので、mongoDB では大文字と小文字が区別/wildcard/i
されるため、検索の手段として使用しています。これが検索を行うための最速の方法ではないことはわかっていますが、より良い解決策は思いつきません。
2 つの方法でクエリを実行できます。1 つ目はfor
、配列に対してループを実行しtags
、結果ごとに次を実行することです。
db.collection.find({tags: /<tag[x]>/i})
または、次のように、すべてのタグを収集し、 を使用して 1 つのルックアップを実行できます$or
。
db.collection.find({$or:[{tags:/<tag1>/i},{tags:/<tag2>/i},{tags:/<tag3>/i}, ... {tags:/<tag50>/i}]});
両方を試してみたところ、使用$or
した方が大幅に高速であることがわかりましたが、アプリケーションが進行中の状態であるため、これが実際に高速であるためなのか、アプリが他の領域で大きなオーバーヘッドを引き起こしているのかを判断するのは非常に困難です(そうです)。
明確にするために、MongoDB では、1 回実行される大きなクエリは、何度も実行される小さなクエリよりも高速ですか?
EDIT:別の例は、に基づいて3つの個々のレコードを_id
検索する方が、を使用して1回検索するよりも速いかどうか{$or:[{_id: ObjectId([id1])},{_id: ObjectId([id2])},{_id: ObjectId([id3])}]}
です。少ないほど多いですか?