MongoDB在undefined与null之间进行区分

Alb*_*elB 8 mongodb

我正在检查查询非值的逻辑,并注意到在使用mongoshell时,它区分undefinednull值.

> use test
> db.test.insert({ a : 1,          b : null,       c : undefined })
> db.test.insert({ a : null,       b : undefined,  c : 1 })
> db.test.insert({ a : undefined,  b : 1,          c : null })
Run Code Online (Sandbox Code Playgroud)

当您查询集合时,您会得到:

> db.test.find()
{ "_id" : ObjectId("52d95575c9333565e80ccb22"), "a" : 1, "b" : null, "c" : null }
{ "_id" : ObjectId("52d9557fc9333565e80ccb23"), "a" : null, "b" : null, "c" : 1 }
{ "_id" : ObjectId("52d95586c9333565e80ccb24"), "a" : null, "b" : 1, "c" : null }
Run Code Online (Sandbox Code Playgroud)

null但是,当您查询时,它仅检索显式设置为的记录null.

> db.test.find({ a : null })
{ "_id" : ObjectId("52d9557fc9333565e80ccb23"), "a" : null, "b" : null, "c" : 1 }
Run Code Online (Sandbox Code Playgroud)

这是MongoDB中的错误吗? 如何正确查询null/undefined/non-set字段?

编辑

所以我可以使用以下方法查询未设置的值:

db.test.find({ $or : [ { a : null }, { a : { $exists : false } } ] })
Run Code Online (Sandbox Code Playgroud)

但是在这个例子中,它仍然只返回单个记录:

{ "_id" : ObjectId("52d9557fc9333565e80ccb23"), "a" : null, "b" : null, "c" : 1 }
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么/如何区分MongoDB undefinednull?这是如何在MongoDB中输入数据的问题吗?

Jef*_*rey 7

如果要返回存在字段且不为空的文档,请使用 { a : {$ne : null}}

未定义和空值不同,但shell将它们都显示为null - https://jira.mongodb.org/browse/SERVER-6102