我刚刚使用布尔字段更新了我的一个模型。我已将字段的默认值设置为true。如何查询此字段,以便将此字段设置为true或没有此字段的所有文档(默认值)。
答案 0 :(得分:4)
要查找不具有特定密钥的文档,您需要使用$exists
:
<强> $存在强>
如果
语法:{ field: { $exists: <boolean> } }
$exists
为true,
<boolean>
会选择包含该字段的文档。如果<boolean>
为false,则查询仅返回不包含该字段的文档。$exists
确实匹配包含存储null
值的字段的文档。
所以存在检查看起来像:
Model.where(:field.exists => false)
Model.where(:field => { :$exists => false })
请注意,第一个:field.exists
表单在发送到MongoDB之前成为第二个表单;我之所以提到这一点,是因为如果不使用:field
或$and
来合并子句,您将无法在查询的其他位置使用$or
::field.exists
扩展可能会导致密钥在查询Hash中互相覆盖。你不会在这里遇到这个问题,但提醒不会受到伤害。
寻找true
很简单:
Model.where(:field => true)
你想要任何一个,所以将它们与$or
结合起来:
Model.where(:$or => [
{ :field.exists => false },
{ :field => true }
])
如果:field
可能存在null
,但您可以使用{ :field => nil }
来匹配:field
为null
或<的文档/ strong>根本不存在:
Model.where(:$or => [
{ :field => null },
{ :field => true }
])
# or
Model.where(:field.in => [ null, true ]) # This is probably the one you want
如果您正在寻找明确{ :field => { :$type => 10 } }
和的内容,还有null
。现在可能是快速浏览MongoDB FAQ的好时机: