4

根据 MongoDB手册页上 cursor.sort中的信息(关于比较值的最后一段),就 sort() 函数而言,NULL 值小于任何其他值。

问题是,缺少的属性是否被视为 NULL?根据我的测试不是这样:

> db.sort.find().sort({id:1})
{ "_id" : ObjectId("5269554df18e7d2f4bd1241d"), "a" : "Anonym" }
{ "_id" : ObjectId("52695684f18e7d2f4bd12421"), "a" : "Bnonym", "d" : "iii" }
{ "_id" : ObjectId("52695892f18e7d2f4bd12422"), "id" : null, "a" : "Bnonym", "d" : "iii" }
{ "_id" : ObjectId("5269591bf18e7d2f4bd12425"), "id" : null, "a" : "ZZZaaa", "d" : "iii" }
{ "_id" : ObjectId("526954d4f18e7d2f4bd1241b"), "id" : 7, "a" : "Jozo" }

顺序似乎是:

  • 未定义/缺少排序属性
  • 空值
  • 其余的根据手册页的顺序

问:问题是,是否存在一些与 null 不同的未记录类型,因为缺少属性?

4

1 回答 1

2

据我所知(我没有专门查看源代码),这是未定义的,取决于多种因素。最引人注目的是,反转排序通常不会反转 null / undefined 元素的顺序:

> db.sort2.find().sort({"a" : 1});
{ "_id" : ObjectId("526a4d45b4e29833675fb089"), "a" : null }
{ "_id" : ObjectId("526a4d4cb4e29833675fb08b") }
{ "_id" : ObjectId("526a4d48b4e29833675fb08a"), "a" : 21433 }
>
> db.sort2.find().sort({"a" : -1});
{ "_id" : ObjectId("526a4d48b4e29833675fb08a"), "a" : 21433 }
{ "_id" : ObjectId("526a4d45b4e29833675fb089"), "a" : null }
{ "_id" : ObjectId("526a4d4cb4e29833675fb08b") }

a此外,当我为该测试集合创建索引时,顺序发生了变化(!)。但是,当我删除索引时,它并没有变回来。对我来说,仅仅缺乏文档就足以不依赖这种行为,但即使在最简单的情况下,它似乎也很大程度上是不可预测的。

null与不存在的字段的一个明确且重要的区别是在使用稀疏索引时:在稀疏索引中,null是一个有效值并且实际上会被索引(毕竟它一个值),而一个不存在的字段是根本没有添加到索引中。

于 2013-10-25T11:00:06.900 回答