概述
MongoDB
里面存的 文档, 字段可以 不存在
, 可以 为 null
, 可以是 具体的值
在开发过程中,经常需要去查询某个字段有值的所有文档
, 那么此时怎么写才是正确且简单的呢?
数据准备
新建一个集合yu_fa_ce_shi
新增三条数据,如下图所示
a
desc 字段为 null
b
desc 字段有值,是一个字符串
c
desc字段不存在
原始
我们之前查询有值
的场景是这样写的
db.getCollection("yu_fa_ce_shi").find({
desc: {
$ne: null,
$exists: true}
})
功能是正常的
image.png
现在我们来研究一下有没有简化的写法
eq(null)
db.getCollection("yu_fa_ce_shi").find({
desc: null
})
执行之后可以看到,a b 都查询出来了,也就是说
eq(null)
等价于 有值且为null
和 字段不存在
两种场景的并集(也就是in
)
ne(null)
再看一下反向的
db.getCollection("yu_fa_ce_shi").find({
desc: { $ne: null}
})
image.png
执行之后得到结论:ne(null)
等价于 有值且不为null
字符串
由上可知 ne(null)
找到的是 有值且不为null
, 但是因为 MongoDB 的字段可以随便存,类型没有限制
所以,ne(null)
对取出来的值类型没有做限制
那么,如果想要限制一下,比如: 有值且为 string
这种查询怎么写呢?
经过了解, MongoDB 有一种操作符叫 type
type
截图看一下
type
所以我们的查询语句变为
db.getCollection("yu_fa_ce_shi").find({
desc: {
$type: 2
}
})
结果如下,是符合我们预期的
image.png
null
那么问题来了,如何找到 有值且为null
呢?
根据上面的 string
, 同理可知
db.getCollection("yu_fa_ce_shi").find({
desc: {
$type: 10
}
})
image.png
总结
- 查询有值且不为null, 语句为
{$ne: null}
- 查询没有有效值(不存在或者值为null), 语句为
{$eq: null}
, 简化为field: null
- 查询有值且值是字符串, 语句为
{$type: 2}
- 查询有值且值为null, 语句为
{$type: 10}
网友评论