跳转到主要内容
Dan 提交于 13 December 2012

至此你已经看到MongoDB是如何解决SQL问题的。让我们来看看它能否改善前面所讨论的SQL的NULL带来的怪异现象(你在做这个的同时会学习到更多的MongoDB知识,并看到更多的MongoDB查询方面的例子)。

MongoDB处理NULL的方式比SQL稍许理智一些,但它一定还是有它自己的怪处。下面的查找是完全合法的,它同样显示NULL值需要特殊的操作符:

db.test.find({something:null});

这将会找到something有NULL值的文档。非常简单。NULL是自成一派的,与任何其它类型比较的结果都是false,因为MongoDB是严格类型的,不会为你作类型转换。所以,把一个数字同NULL作比较将永远是false,但把同样的数字和字符串相比较是true。这其实不是一个问题——只是一个你需要留意的地方。马上会有例子显示。至少MongoDB没有引入三值逻辑;比较的结果只能是true或false,不会是NULL。

不过,对于NULL有一个警告:不存在的值是当作NULL来处理的。

> db.test.drop() > db.test.insert({a:1}); > db.test.insert({something:null}); > db.test.insert({something:1}); > db.test.find({something:null}); { "a" : 1 } { "something" : null }#

要找到你真正想找的,这样做:

> db.test.find({something:{$in: [null], $exists:true}}); { "something" : null }

新的操作符是$in和$exists。下面是将NULL和1作比较的例子:

> db.test.find({something: {$gte: null }}); { "a" : 1 } { "something" : null }

我们再次看到,第一个文档不包含something属性,所以当作比较时,它是匹配的。第二个文档包含一个something: NULL的组合,并且操作符是“大于等于”($gte),所以它也匹配了。你有一个something为1的文档,但它不匹配——因为NULL不是零。