MongoDB 支持多种类型的数据。其中一些类型再查询时会有特别的表现。这篇我们来说说在 MongoDB 中特殊类型 —— null 类型的查询语法。
有一个包含如下文档的集合:
> db.ecosystem.find()
{ "_id" : ObjectId("6055443e63d8bae73fc0f506"), "x" : 1, "y" : null }
{ "_id" : ObjectId("6055444e63d8bae73fc0f507"), "x" : 2, "y" : "one" }
{ "_id" : ObjectId("6055445f63d8bae73fc0f508"), "x" : 4, "y" : "two" }
>
复制代码
现要查询“y”键为 null 的文档:
> db.ecosystem.find({'y':null})
{ "_id" : ObjectId("6055443e63d8bae73fc0f506"), "x" : 1, "y" : null }
>
复制代码
这里提一点,null 不仅会匹配某个键的值为 null 的文档,而且还会匹配不包含这个键的文档。例如,下面这个查询,文档中是不包含“none”这个键的,所以查询“none”键为 null 会返回缺少这个键的所有文档:
> db.ecosystem.find({'none':null})
{ "_id" : ObjectId("6055443e63d8bae73fc0f506"), "x" : 1, "y" : null }
{ "_id" : ObjectId("6055444e63d8bae73fc0f507"), "x" : 2, "y" : "one" }
{ "_id" : ObjectId("6055445f63d8bae73fc0f508"), "x" : 4, "y" : "two" }
>
复制代码
所以,如果仅仅是想匹配键为 null 的文档,既要检查该键的值是否为 null,还要通过“$exists”条件判定键值已存在:
> db.ecosystem.find({"none":{"$in":[null],"$exists":true}})
>
>
复制代码
很明显,这里是查询不到记录出来的。
这里需要注意的一点是,MongoDB 是没有“$eq”操作符的,所以 $in:[null] 这条查询看起来不精简,但是使用一个元素的“$in”操作符效果是一样的。
评论