我在这里做了一个快速测试并运行了几个解释来查看每个查询的样子,第一个是指定类型的查询:
PRIMARY> db.nulltest.find( { "a" : { $type : 10 } } ).explain()
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 110011,
"nscannedObjects" : 110011,
"n" : 110011,
"millis" : 121,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
null,
null
]
]
}
}
然后以 null 为标准:
PRIMARY> db.nulltest.find( { "a" : null } ).explain()
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 110011,
"nscannedObjects" : 110011,
"n" : 110011,
"millis" : 122,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
null,
null
]
]
}
}
结果看起来几乎相同(1ms 并不重要),并且在说明中的索引范围相同。因此我怀疑这里根本没有区别,所以坚持使用更易读的语法是个好主意