首页/数据/NoSQL 速查/collation 排序规则
MongoDB99 条

collation 排序规则

collation 定义字符串比较规则(大小写、变音符号、语言习惯):索引与查询要使用一致的 collation 才能互相命中。

NoSQL 速查数据更新于 2026-10-13

是什么

collation(排序规则)定义字符串怎么比较:是否区分大小写、是否区分变音符号、数字按字符还是按数值比较、中文按拼音还是笔画排序。默认情况下 MongoDB 按二进制比较字符串,大写字母永远排在小写字母前面。索引与查询必须使用一致的 collation 才能互相命中,这是 collation 最容易踩的坑。

基本信息

创建索引createIndex({ name: 1 }, { collation: { locale: "zh", strength: 2 } })
strength1 忽略大小写与变音;2 区分变音但不区分大小写;3 默认,区分大小写与变音;4 再考虑标点层级;5 完全相同
查询find(...).collation({ locale: "zh", strength: 2 })
聚合db.coll.aggregate(pipeline, { collation: { locale: "zh" } })
集合默认createCollection 时指定 collation,之后索引与查询可继承
常用选项numericOrdering(数字按数值比较)、caseFirst、normalization、backwards

典型使用场景

  • 不区分大小写的登录名查询:邮箱、用户名按忽略大小写的规则比较,避免存两套
  • 中文排序:按拼音序排出通讯录、地区列表,比按二进制排更符合使用习惯
  • 忽略变音符号检索:拉丁字母带音标的数据按基础字母匹配
  • 数字字符串排序:编号列按数值大小排序,避免出现 10 排在 9 前面
  • 迁移对照:把历史数据的比较规则与业务预期核对,找出因规则不一致造成的重复数据

创建与查询

创建与查询
db.users.createIndex({ name: 1 }, { collation: { locale: "zh", strength: 2 } })  # 索引按拼音、忽略大小写
db.users.find({ name: "张伟" }).collation({ locale: "zh", strength: 2 })            # 查询必须带同样规则
db.users.find({ name: "zhang" }).collation({ locale: "en", strength: 1 })           # 忽略大小写与变音
db.orders.aggregate([                                                            # 聚合里也要显式指定
  { $sort: { code: 1 } }
], { collation: { locale: "en", numericOrdering: true } })                       # 编号按数值排序

db.users.getIndexes()                                                            # 确认索引上的 collation
db.users.dropIndex("name_1")                                                      # collation 不能改,只能删了重建

strength 取值读法

strength比较规则典型效果
1主级:只比基础字符a 与 A、é 与 e 视为相同
2次级:加变音符号区分 é 与 e,仍不区分大小写
3三级(默认)区分大小写与变音
4四级再考虑标点等层级差异
5完全相同等价于按二进制比较
索引带 collation 而查询不带时,查询会按二进制比较,索引无法被使用,性能退化且结果可能少匹配;反过来查询带 collation 而索引不带也一样用不上,两边必须完全一致。
collation 只能在创建索引时指定,之后无法修改,需要改规则必须删索引重建。如果整库的比较规则统一,直接用集合默认 collation 更省心;中文排序的具体可用变体(拼音、笔画等)以所用版本的 ICU 支持为准。

易错点

  • 索引与查询的 collation 不一致:索引白建,查询退化为全表扫描,还可能出现「明明有这条数据却查不到」的错觉
  • 以为建了不区分大小写的索引,旧查询就自动生效:老代码里的查询不带 collation,必须逐一改造
  • 在同一个集合上混用多种比较规则:不同 collation 的索引互相不可用,索引数量与写入成本都会上升
  • 用默认二进制规则做去重:Email 这类字段会因为大小写差异产生重复记录,去重逻辑要在写入口就统一规则

数据来源与参考

  • MongoDB Manual: Collation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌