web-dev-qa-db-ja.com

MongoDB $またはクエリ

私はmongoShellで次のクエリを実行します:

db.Profiles.find ( { $or: [ {"name": "gary"}, {"name": "rob"} ] } )

期待どおりに何も返さない(JSON)?

18
Fruitful

$ inを使用する

質問のクエリには、 $ in を使用する方が適切です。

db.Profiles.find ( { "name" : { $in: ["gary", "rob"] } } );

なぜそれが機能しないのですか

引用符がありません-CLIは、またはの2番目の部分が完了するのを待っています:

db.Profiles.find ( { $or : [ { "name" : "gary" }, {"name":"rob} ] } )
..............................................................^

Cliがクエリを解析して構文エラーがあると言うには、クエリを十分に終了する必要があります。

大文字と小文字を区別しないマッチング

コメントで示されているように、大文字と小文字を区別しない方法で検索する場合は、$or$ regex とともに使用します。

db.Profiles.find ( { $or : [ { "name" : /^gary/i }, {"name": /^rob/i } ] } )

または、1つの正規表現を使用するだけです。

db.Profiles.find ( { "name" : /^(gary|rob)/i } )

ただし、固定文字列で始まらない正規表現クエリはインデックスを使用できないため(インデックスを使用できず、「一致するものが見つからなくなるまでここから開始してからベイル」を効果的に実行できます)、したがって最適ではありません。これが要件である場合は、正規化された名前フィールド(例:name_lc-小文字の名前)を保存し、それに対してクエリを実行することをお勧めします。

db.Profiles.find ( { "name_lc" : { $in: ["gary", "rob"] } } );
47
AD7six