MongoDB在undefined与null之间进行区分

时间:2014-01-17 16:17:17

标签: mongodb

我正在检查用于查询非值的逻辑,并注意到在使用mongo shell时,它会区分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 })

当你对集合进行查询时,你会得到:

> 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 }

但是,当您在null上进行查询时,它只会检索明确设置为null的记录。

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

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

修改

所以我可以用这个来查询未设置的值:

db.test.find({ $or : [ { a : null }, { a : { $exists : false } } ] })

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

{ "_id" : ObjectId("52d9557fc9333565e80ccb23"), "a" : null, "b" : null, "c" : 1 }

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

答案 2 :(得分:0)

如果您想知道,为什么MongoDB将undefined强制转换为null而不是仅仅忽略此类属性-ignoreUndefined标志可以解决此问题。

https://mongodb.github.io/node-mongodb-native/2.1/reference/connecting/connection-settings/