【问题标题】:Mongodb error $substrBytes: Invalid range, ending index is in the middle of a UTF-8 characterMongodb 错误 $substrBytes: Invalid range, end index is in the middle of an UTF-8 character
【发布时间】:2017-04-22 06:27:50
【问题描述】:

我正在查询以从我的图书收藏中提取属性“titlu”的不同首字母,以便根据图书“titlu”属性的首字母对它们进行分组。我有一些以 UTF-8 字符开头的标题,例如 Î、Ț、Ș 等,但我收到了这个错误:

显而易见的问题是:如何消除该错误? 有两种可接受的选择:

  1. 理想情况下,我应该能够显示 Î、Ș、Ț 等
  2. 如果不可能,也可以改为显示 I、S、T,并将 I 组中以 Î 开头的标题、S 组中以 Ș 开头的标题等组合在一起。

但是,转换必须在 mongo 查询中完成,因为我还需要标题的计数。 (对于解决方案#2,我们需要字母 I,例如以 I 开头的标题的出现次数 + 以 Î 开头的标题的出现次数)。

【问题讨论】:

    标签: mongodb utf-8 aggregation-framework spring-data-mongodb


    【解决方案1】:

    您应该使用 $substrCP 而不是 $substr$substrCP 在 mongodb 3.4 中被引入来解决此类问题,因为 $substr 仅适用于 ASCII 字符

    来自 mongodb 文档:

    $substrCP

    返回字符串的子字符串。子字符串以指定 UTF-8 代码点 (CP) 索引(从零开始)处的字符开头 指定代码点数的字符串。

    所以您的查询将是:

    db.carte.aggregate([
      {$project: {
          preview: {$substrCP: ["$titlu", 0, 1]}
        }
      }
    ])
    

    您可以在线试用:mongoplayground.net/p/X6Mo1yEhJoI

    【讨论】:

    • 太棒了,谢谢!有什么方法可以将 Ș 与 S 结果分组?或者可能是自定义排序,以便字母顺序为 A、Ă、Î、B...I、Î、...S、Ș 等?
    • 看看collation:只需在您的聚合查询中指定一级排序规则
    • 这并不重要,我总是可以使用 java 端进一步订购/分组。
    • 根据这个问题stackoverflow.com/questions/42165412/…,spring data mongo db 不支持排序规则。就像我说的,我会对结果进行手动排序。我想我可以直接使用 mongo 驱动程序来执行查询,但这是我必须考虑的事情,因为使用 mongo 驱动程序执行 mongo 任务会稍微困难一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多