比较/排序顺序
在排序操作中比较不同 BSON 类型的值时,MongoDB 使用以下从低到高的比较顺序:
MinKey(内部类型)
null
数值(int、long、double、decimal)
符号,字符串
对象
阵列
BinData
ObjectId
布尔
Date
时间戳
正则表达式
MaxKey(内部类型)
数值类型
出于比较目的,MongoDB 会将某些类型视为等效类型。对于实例来说,数字类型在比较之前会进行转换。
字符串
二进制比较
默认情况下,MongoDB 使用简单的二进制比较来比较字符串。
排序规则
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
排序规则规范具有以下语法:
{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
指定排序规则时,locale
字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档。
如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。
数组
在数组比较时:
小于比较,或是升序排序,根据 BSON 类型排序顺序来比较数组的最小元素。
大于比较,或是降序排序,根据反向 BSON 类型排序顺序来比较数组的最大元素。
比较值为单元素数组的字段(如
[ 1 ]
)与非数组字段(如2
)时,比较对象为1
和2
。比较空数组(如
[ ]
)时将空数组视为小于null
值或缺少字段值。
对象
MongoDB 对 BSON 对象的比较使用以下顺序:
按照 BSON 对象中键值对出现的顺序递归比较键值对。
比较字段类型。MongoDB 对字段类型使用以下从低到高的比较顺序:
MinKey(内部类型)
null
数值(int、long、double、decimal)
符号,字符串
对象
阵列
BinData
ObjectId
布尔
Date
时间戳
正则表达式
MaxKey(内部类型)
如果字段类型相同,则比较键字段名称。
如果键字段名称相同,则比较字段值。
如果字段值相同,则比较下一键/值对(返回步骤 1)。没有更多键值对的对象小于有更多键值对的对象。
日期和时间戳
日期对象排序在时间戳对象之前。
Non-existent Fields
比较时,会将不存在的字段视为空 BSON 对象。因此,对文档 { }
和 {
a: null }
中的 a
字段进行排序时会将这些文档视为采用了等同排序顺序。
BinData
MongoDB 按以下顺序对 BinData
进行排序:
首先,数据的长度或大小。
然后,按 BSON 一字节子类型进行比较。
最后,通过数据执行逐字节比较。