选择字段不存在、为空或为假的 MongoDB 文档?

Posted

技术标签:

【中文标题】选择字段不存在、为空或为假的 MongoDB 文档?【英文标题】:Select MongoDB documents where a field either does not exist, is null, or is false? 【发布时间】:2014-04-12 23:42:32 【问题描述】:

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

 "_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”处于虚假状态的所有文档;也就是说,要么不存在,要么为空,要么为假?也就是说,查询选择 Apple、Banana 和 Cherry,但不选择 Kiwi?

According to the MongoDB FAQ、 "is_reported": null 将选择“is_reported”为空或不存在的文档,但仍不会选择“is_reported”为假的文档。

现在我有以下查询,它工作正常,但它看起来不是很优雅。如果我需要选择多个字段,它会很快变得混乱。是否有更好的查询可以达到相同的最终结果?

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

【问题讨论】:

【参考方案1】:

您可以使用$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)

【讨论】:

是否查询字段不存在的文档? @wbeange 是的,null 查询值也匹配不存在该字段的文档。

以上是关于选择字段不存在、为空或为假的 MongoDB 文档?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:如何查询字段为空或未设置的记录?

选择 mongoid 中不为空或为空的位置

如何检查数据读取器是不是为空或为空

QMessageLogContext 的字段(如:文件、函数、行)为空或为零

查找字段存在或为空的文档

检查所有三列是不是不为空或为空