首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序时,Mongodb首先返回大写字符串。

排序时,Mongodb首先返回大写字符串。
EN

Stack Overflow用户
提问于 2013-11-08 09:05:09
回答 4查看 10.2K关注 0票数 8

当我尝试对一个集合排序一个字符串字段(这里是Title)时,排序不像预期的那样工作。请见下文:

代码语言:javascript
复制
db.SomeCollection.find().limit(50).sort({ "Title" : -1 });

实际结果顺序

  • 标题:"geog.3学生书“
  • “书名”:“地理2学生书”
  • “书名”:“地理1学生书”
  • 标题:“佐伊和斯威夫特”
  • 标题:“主题公园的Zip”
  • 标题:“超市里的Zip”

预期结果顺序

  • 标题:“佐伊和斯威夫特”
  • 标题:“主题公园的Zip”
  • 标题:“超市里的Zip”
  • 标题:"geog.3学生书“
  • “书名”:“地理2学生书”
  • “书名”:“地理1学生书”

当我试图按日期字段进行排序时,也会出现相同的问题。

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-08 09:11:48

更新:版本3.4有不区分大小写指标

这是一个众所周知的问题。MongoDB不支持字符串的词法排序(JIRA:字符串字典排序)。您应该对应用程序代码中的结果进行排序,或者使用数字字段进行排序。不过,它应该可靠地对日期字段进行排序。你能给出一个按日期排序不起作用的例子吗?

票数 6
EN

Stack Overflow用户

发布于 2013-11-08 09:22:33

有什么让你惊讶的?

它根据符号的数字表示形式进行排序。如果您要查看这里 (我知道mongodb在UTF-8中存储字符串,所以这只是为了教育目的)。您将看到大写字母有相应的数字,低于小写字母。因此,他们将走在前面。

Mongodb不能根据本地化或不区分大小写对字母进行排序。

在您的示例中,g的数字高于Z,因此它首先进行排序(按递减顺序排序)。然后3的对应数高于21。所以基本上一切都是正确的。

票数 3
EN

Stack Overflow用户

发布于 2013-11-08 12:14:54

从没有正确排序的日期开始..。

如果将日期存储为string,则需要将其作为字符串进行排序。很简单:

代码语言:javascript
复制
2013-11-08  // yyyy-mm-dd (the dashes would be optional)

只要日期字符串的每一段都正确地填充了0,字符串就会按照您预期的方式自然排序。

完整的日期时间通常存储在UTC中:

代码语言:javascript
复制
2013-11-23T10:46:01.914Z

但是,我还建议您不要将日期值存储为字符串,而是考虑使用本机MongoDB日期是否更有意义(参考文献)。如果查看MongoDb的聚合框架,您会发现有许多函数可以操作这些日期,而字符串是非常有限的。

至于字符串排序,有人指出,排序就像计算机存储数据,而不是以个人的方式排序。如果您认为字符串存储为其ASCII/UTF-8表示形式,那么您应该了解为什么排序工作方式是这样的:

代码语言:javascript
复制
Zoe = [90, 111, 101]
geo = [103, 101, 111]

如果要按您指定的降序排序,您应该看到"geo"的内部字节表示比字符串"Zoe"大(在本例中,103排序高于90 )。

通常,使用MongoDb时的建议是,如果需要对具有混合大小写的字符串排序,则需要存储字符串两次:

  1. 原始字符串("Title")
  2. 作为一个规范化的字符串。例如,可能都是“小写”,可能带有重音字符,也可以转换为公共字符。例如,您将得到一个名为"SortedTitle"的新字段,您的代码将使用该字段进行排序,但将实际的"Title"“显示给用户。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19855147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档