Mongo能否按升序返回末尾带有空/缺失字段的文档?

9
db.jason.find().sort({"rank":1})

{ "_id" : ObjectId("51ae517372779b7eeeb81342"), "name" : "jason" }
{ "_id" : ObjectId("51ae517372779b7eeeb81343"), "name" : "jason" }
{ "_id" : ObjectId("51ae513772779b7eeeb8133a"), "name" : "jason", "rank" : 0 }
{ "_id" : ObjectId("51ae513772779b7eeeb8133b"), "name" : "jason", "rank" : 1 }
{ "_id" : ObjectId("51ae513772779b7eeeb8133c"), "name" : "jason", "rank" : 2 }

我希望文档未排序,而不是按开始时间排序...但同时保持有排序的项目按升序排列。这是否可行,或者我需要使用字符串或高数值(如99999)来默认空值?
2个回答

9
当使用db.jason.find().sort({"rank":1})查询时,MongoDB会按照“rank”字段的类型和值排序文档。在排序过程中,如果某个字段缺失,则MongoDB会将其视为具有NULL类型的字段,并将其排在数值类型之前。这种排序方式无法更改(请参见http://docs.mongodb.org/manual/reference/method/cursor.sort/以了解内置类型排序顺序)。我建议您分别构建两个查询(一个用于包含“rank”字段的文档,一个用于不包含“rank”字段的文档),并在应用程序中合并结果。但是,如果您需要保持单个查询,则需要设置所有文档中的“rank”字段以生成所需的顺序(例如,使用一个哨兵值及其类型在数值类型之后进行排序)。

我猜你已经知道了,你是否了解 eval() 函数?它似乎可以处理自定义排序,但对于空字段就不太确定了。 - jasonsemko

0
为了避免这个问题,我采取了另一个布尔键- {"isRanked":Boolean},然后进行了多字段排序,排序方式为:{"isRanked":-1, "rank":1}。
通过这种方式,我得到了我的结果,"rank"在末尾缺失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接