当对不同BSON类型数据进行比较时,Mongo使用如下比较顺序,从低到高:
(1)MinKey(internal type)(2)Null(3)Numbers(ints,longs,doubles,decimals)(4)Symbol,String(5)Object(6)Array(7)BinData
(8)ObjectId(9)Boolean(10)Date(11)Timestamp(12)Regular Expression(13)MaxKey(internal type)
数字类型:Mongo把一些类型作为比较目标。例如,数字类型的在比较前要进行转换。
String:默认情况下,Mongo使用简单二进制来比较字符串。
Collation:3.4版本新加,允许用户对字符串排序指定语言特定的规则,就像字母大小写,重点标记。
Collation定义的语法如下:
{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
当指定Collation时,locale域是必输项,其他的可选。
如果没有Collation指定在集合或者操作上,MongoDB对于字符串的比较跟以前版本一样,都是简单二进制对比。
Arrays:对于数组的比较,如果是小于或者升序比较,比较数组中的最小元素。如果是大于或者降序比较,比较数组中的最大元素。
空数组小于非空数组。
Dates and Timestaps:3.0.0版本之前两者同时排序,之后Date对象优先于Timestamp对象。
对于不存在或者值不存在域的比较,以空作处理。
BinData类型的排序步骤如下:
(1)首先数据的长度或者尺寸。
(2)然后通过BSON的一个字节的亚类型。
(3)最后,通过这些数据,执行一个字节对字节的比较