至此你已经看到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不是零。