mongoDB - Collation

Collation特性(排序规则) 是mongoDB 3.4 版本新增的。 允许MongoDB的用户根据不同的语言定制排序规则。

1. 排序属性

排序规则有如下的字段属性

// 排序规则文档
{
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

locale字段是强制性必选参数;所有其他排序规则字段都是可选的。

1.1 locale

国家地区语言设置, 要指定简单的二进制比较,将locale 值设定为"simple"即可
具体local 及国家地区语言对照表如下

locations - locales

使用语法,@collation=<variant> 可选

{ "locale" : "<locale code>@collation=<variant>" }

// 示例:
{ "locale" : "zh@collation=unihan" }
1.2 strength

可选参数, 表示要执行的比较级别。有如下几种参数值

参数值 描述
1 初级比较水平。 Collation 仅执行基本字符的比较,忽略其他差异,例如变音符号和大小写
2 二级比较。 Collation 执行直到次要差异的比较,例如变音符号。也就是说,排序规则执行基本字符(主要差异)和变音符号(次要差异)的比较。基本字符之间的差异优先于次要差异
3 三级比较。 Collation 执行直到三级差异的比较,例如大小写和字母变体。也就是说,排序规则执行基本字符(主要差异)、变音符号(次要差异)以及大小写和变体(三次差异)的比较。基本字符之间的差异优先于二级差异,二级差异优先于三级差异。 这是默认级别
4 第四级。仅限于在 1-3 级忽略标点符号或处理日语文本时考虑标点符号的特定用例
5 仅限于联络断路器的特定用例
1.3 caseLevel

可选参数,当strength 参数为1和2 时 该参数标识是否支持大小写比较
如果caseLevel =true,表示支持大小写比较

  • strength =1: 排序规则比较基本字符和大小写
  • strength =2: collation 比较基本字符、变音符号(以及可能的其他次要差异)和大小写

如果caseLevel =false , 表示不支持大小写比较

Flag that determines whether to include case comparison at strength level 1 or 2

1.4 caseFirst

可选参数 在三级比较时 确定大小写差异排序顺序的字段

参数值 含义
"upper" 大写在小写之前排序
"lower" 小写在大写之前排序
"off" 默认值,与“lower”相似但略有不同
1.5 numericOrdering

可选参数,确定是将数字字符串作为数字还是字符串进行比较的标志,默认值为fasle
如果 numericOrdering= true,表示将数字字符串作为数字比较,
例如,“10”大于“2”

反之,numericOrdering= false,则作为字符串进行比较。例如,“10”小于“2”

局限

  • 在比较中只考虑连续的非负整数数字子串。 numericOrdering 不支持:+,-,小数分隔符,如小数点和小数逗号,指数

  • 只有数字或十进制数字 类别中的 Unicode 代码点被视为数字

  • 如果数字长度超过 254 个字符,超出的字符将被视为单独的数字

示例:

// 数据库中插入如下的字符串数字
db.c.insertMany(
   [
       { "n" : "1" },
       { "n" : "2" },
       { "n" : "2.1" },
       { "n" : "-2.1" },
       { "n" : "2.2" },
       { "n" : "2.10" },
       { "n" : "2.20" },
       { "n" : "-10" },
       { "n" : "10" },
       { "n" : "20" },
       { "n" : "20.1" }
   ]
)

// 设置排序后

db.c.find(
   { }, { _id: 0 }
).sort(
  { n: 1 }
).collation( {
  locale: 'en_US',
  numericOrdering: true
} )

结果:

[
    { n: '-2.1' },
    { n: '-10' },
    { n: '1' },
    { n: '2' },
    { n: '2.1' },
    { n: '2.2' },
    { n: '2.10' },
    { n: '2.20' },
    { n: '10' },
    { n: '20' },
    { n: '20.1' }
]
1.6 alternate

可选参数。确定排序规则是否应将空格和标点符号视为基本字符以进行比较的字段。

参数值 含义
"non-ignorable" 空格和标点符号被视为基本字符,默认值
"shifted" 空格和标点不被视为基本字符,仅在strength> 3 时才能区分
1.7 maxVariable

可选参数, 当 alternate参数是 "shifted"时,确定哪些字符被视为可忽略的字段
当alternate= "non-ignorable"时, 该参数不生效

参数值 含义
"punct" 空格和标点符号都是可忽略的,不被视为基本字符
"space" 空格是可忽略的,不被视为基本字符
1.8 backwards

可选参数,确定带有变音符号的字符串是否从字符串后面排序的标志,例如某些法语字典排序。 如果为true,请从后到前进行比较。 如果为false,则从前到后进行比较。 默认值为false

1.8 normalization

可选参数。确定是否检查文本是否需要规范化并执行规范化的标志。通常,大多数文本不需要这种规范化处理。 如果为true,检查是否完全规范化并执行规范化以比较文本。 如果为false,则不检查。 默认值为fasle

1.9 参数值列表

Collation 参数中,locale 是必选参数,其他的都是可选参数,以下参数默认在所有语言环境中(locales)都是一致的:

  • caseLevel : false
  • strength : 3
  • numericOrdering : false
  • maxVariable : punct

下图是在不同locale 参数中,其他可选参数的默认值,供参考


参数值列表

注意 不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带有排序的查找,则不能使用一种排序规则进行查找而使用另一种排序规则进行排序

2. 支持排序规则的操作

支持排序规则的操作指指令如下图所示

操作指令

使用示例

// 集合 myColl 在 `category` 字段上设置一个索引并设置了语言为'fr' 的排序规则
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
// 以下查询操作指定与索引相同的排序规则,可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
// 以下查询操作,默认情况下使用“simple”二进制排序方式,不能使用索引
db.myColl.find( { category: "cafe" } )

对于索引前缀键不是字符串、数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。

// 集合 myColl 对数字字段 score 和 price 以及字符串字段category具有复合索引;索引是使用排序规则语言环境“fr”创建的,用于字符串比较
db.myColl.createIndex(
   { score: 1, price: 1, category: 1 },
   { collation: { locale: "fr" } } )

//以下使用“simple”二进制排序规则进行字符串比较的操作可以使用索引:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
// 以下操作使用“simple”二进制排序规则对索引类别字段进行字符串比较,可以使用索引仅满足查询的 score: 5 部分
db.myColl.find( { score: 5, category: "cafe" } )

参考文档:https://www.mongodb.com/docs/manual/reference/collation/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容