web-dev-qa-db-ja.com

フィールドが存在しない、null、またはfalseのMongoDBドキュメントを選択しますか?

次のドキュメントを含むコレクションがあるとします。

{ "_id": 1, name: "Apple" }
{ "_id": 2, name: "Banana", "is_reported": null }
{ "_id": 3, name: "Cherry", "is_reported": false }
{ "_id": 4, name: "Kiwi",   "is_reported": true }

「is_reported」が偽の状態にあるすべてのドキュメントを選択する簡単なクエリはありますか。つまり、存在しない、null、またはfalseのいずれかです。つまり、Apple、Banana、Cherryを選択するが、Kiwiは選択しないクエリですか?

MongoDB FAQによると{ "is_reported": null }は、「is_reported」がnullまたは存在しないドキュメントを選択しますが、「is_reported」がfalseであるドキュメントは選択しません。

現在、私は次のクエリを持っていますが、これは正常に機能しますが、非常にエレガントに見えません。選択する必要のあるフィールドが複数ある場合、非常に速く混乱します。同じ最終結果を達成するより良いクエリはありますか?

db.fruits.find({ $or: [ { "is_reported": null }, { "is_reported": false } ] })
37
sffc

$in でこれを行うことができます:

db.fruits.find({is_reported: {$in: [null, false]}})

戻り値:

{
  "_id": 1,
  "name": "Apple"
}
{
  "_id": 2,
  "name": "Banana",
  "is_reported": null
}
{
  "_id": 3,
  "name": "Cherry",
  "is_reported": false
}

除外するtrue以外の値がない場合は、論理的に入れ替えて$neを使用することもできます。

db.fruits.find({is_reported: {$ne: true}})
91
JohnnyHK