モンゴ:特定のフィールドを持たないアイテムを検索する


107

MongoDBの特定のフィールドが欠落しているコレクション内のドキュメントを検索するにはどうすればよいですか?

回答:


171

ええ、$ existsを使用することは可能です:

db.things.find( { a : { $exists : false } } ); // return if a is missing

trueの場合、$ existsは、フィールド値がnullであるドキュメントを含む、フィールドを含むドキュメントと一致します。がfalseの場合、クエリはフィールドを含まないドキュメントのみを返します。


1
注意してください、$existクエリはインデックスを使用できません(mongodb.org/display/DOCS/…を参照)。
Theo

4
@Theo:2.0 $が存在するのMongoDBから始まっは(インデックスを使用することができますjira.mongodb.org/browse/SERVER-393
ドミトリーSchetnikovich

この後、Mongoidをスコープで使用しました。このように見えますscope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

フィールドが欠落していないnullかどうか(またはまったくない場合)が気にならない場合はnull、少し短く安全です。

db.things.find( { a : null } ); // return if a is missing or null

フィールドがnullであっても$exists返されるため、安全ですtrue。これは、多くの場合、望ましい結果ではなく、NPEにつながる可能性があります。


1
ただし、フィールドが等しく、null欠落していない必要があるため、コードを読んでいる誰かがそれを解釈する場合があります。これは実際には予期しない動作です。同じことを行うことはできないため0(これもfalse)、ここでnullは一種の例外です。したがって、ベストプラクティスは、$exists: falseあいまいではない、より読みやすい回答を使用することです。コメントを付ける必要がある場合、少し短いバリアントは実際には短くありません。
イエティ

@Yetiは、私の目標は、フィールドの値が欠落しているすべてのオブジェクトを検索する場合aのいずれかのために、aであるnullかのでa不足している、そして$existsそれは例キャッチしないように、良い十分ではありませんaですnull
nilskp 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.