当我尝试对一个集合排序一个字符串字段(这里是Title)时,排序不像预期的那样工作。请见下文:
db.SomeCollection.find().limit(50).sort({ "Title" : -1 });实际结果顺序
预期结果顺序
当我试图按日期字段进行排序时,也会出现相同的问题。
有什么建议吗?
发布于 2013-11-08 09:11:48
更新:版本3.4有不区分大小写指标
这是一个众所周知的问题。MongoDB不支持字符串的词法排序(JIRA:字符串字典排序)。您应该对应用程序代码中的结果进行排序,或者使用数字字段进行排序。不过,它应该可靠地对日期字段进行排序。你能给出一个按日期排序不起作用的例子吗?
发布于 2013-11-08 09:22:33
有什么让你惊讶的?
它根据符号的数字表示形式进行排序。如果您要查看这里 (我知道mongodb在UTF-8中存储字符串,所以这只是为了教育目的)。您将看到大写字母有相应的数字,低于小写字母。因此,他们将走在前面。
Mongodb不能根据本地化或不区分大小写对字母进行排序。
在您的示例中,g的数字高于Z,因此它首先进行排序(按递减顺序排序)。然后3的对应数高于2和1。所以基本上一切都是正确的。
发布于 2013-11-08 12:14:54
从没有正确排序的日期开始..。
如果将日期存储为string,则需要将其作为字符串进行排序。很简单:
2013-11-08 // yyyy-mm-dd (the dashes would be optional)只要日期字符串的每一段都正确地填充了0,字符串就会按照您预期的方式自然排序。
完整的日期时间通常存储在UTC中:
2013-11-23T10:46:01.914Z但是,我还建议您不要将日期值存储为字符串,而是考虑使用本机MongoDB日期是否更有意义(参考文献)。如果查看MongoDb的聚合框架,您会发现有许多函数可以操作这些日期,而字符串是非常有限的。
至于字符串排序,有人指出,排序就像计算机存储数据,而不是以个人的方式排序。如果您认为字符串存储为其ASCII/UTF-8表示形式,那么您应该了解为什么排序工作方式是这样的:
Zoe = [90, 111, 101]
geo = [103, 101, 111]如果要按您指定的降序排序,您应该看到"geo"的内部字节表示比字符串"Zoe"大(在本例中,103排序高于90 )。
通常,使用MongoDb时的建议是,如果需要对具有混合大小写的字符串排序,则需要存储字符串两次:
"Title")"SortedTitle"的新字段,您的代码将使用该字段进行排序,但将实际的"Title"“显示给用户。https://stackoverflow.com/questions/19855147
复制相似问题