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 类型
- 最后再一个字节一个字节的比较