选择一个字段不存在,为null或为false的MongoDB文档?

sff*_*ffc 34 database mongodb mongodb-query

假设我有一个包含以下文档的集合:

{ "_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 }
Run Code Online (Sandbox Code Playgroud)

是否有更简单的查询来选择"is_reported"处于假状态的所有文档; 也就是说,要么不存在,要么为空,否则为假?也就是说,选择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 } ] })
Run Code Online (Sandbox Code Playgroud)

Joh*_*yHK 81

你可以这样做$in:

db.fruits.find({is_reported: {$in: [null, false]}})
Run Code Online (Sandbox Code Playgroud)

收益:

{
  "_id": 1,
  "name": "Apple"
}
{
  "_id": 2,
  "name": "Banana",
  "is_reported": null
}
{
  "_id": 3,
  "name": "Cherry",
  "is_reported": false
}
Run Code Online (Sandbox Code Playgroud)

您还可以在逻辑上翻转并使用$ne除了true排除以外没有任何值:

db.fruits.find({is_reported: {$ne: true}})
Run Code Online (Sandbox Code Playgroud)

  • @wbeange是的,`null`查询值也匹配该字段不存在的文档. (7认同)
  • null查询文件哪里不存在字段? (5认同)