mongodb 中数据比较或排序机制
查询与排序是数据库常用的两个操作,如果能理解 Mongodb 中比较的机制,那么在使用中将会变得更加得心应手。
因此,本文对这些机制进行总结。
不同 BsonType 之间的比较顺序
每一个 bsonType 都有一个 order,当使用不同的 bsonType 进行排序比较时,它们的顺序由低到高为:
- MinKey (internal type)
- Null
- Numbers (ints, longs, doubles, decimals)
- Array
- Symbol, String
- Object
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey (internal type)
 
数字类型比较
Mongodb 将 int、long、
double、decimal
都视作一个类型,在进行比较时,会对它们进行转换。
字符串类型比较
二进制
默认使用二进制来比较字符串
规则(collation)
也可以使用特定语言规则来进行比较。参考 Collaction
数组比较
- 小于比较或升序排序,先对数组中的元素进行排序(不同的 bsonType 按上述顺序进行排序),然后比较数组中的最小元素
- 大于大于或降序排序,比较数组的最大元素。
- 将其值为单元素数组(例如[ 1 ])的字段与非数组字段(例如2)进行比较时,实际比较的是1和2。
- 比较空数组(例如[ ])会将空数组视为小于null或缺少字段。
对象比较
对象比较按以下步骤进行:
- 按键值对在 BsonObject 中出现的顺序进行比较 
- 先比较键值(字段值)的类型,如果是不同的 bsonType 的键值按开篇中的顺序进行比较 
- 如果类型相等,则比较键值 
- 如果键值相等,则比较键名(字段名) 
- 如果上述都相等,则继续比较下一个键值对。 - 如果键值对存在于对象 A,而不存在于对象 B 中,则 A 大于 B 
时间(Date)与时间戳(Timestamp)比较
Date 在 Timestamp 之前排序。
不存在的字段比较
字段为 null 的对象视作对象不存在该字段,例如
{} 与 {a: null} 是相等的。
二进制比较
二进制按如下顺序进行比较:
- 先比较数据长度
- 然后比较一个字节的 bsonType 类型
- 最后再一个字节一个字节的比较