mongodb 中数据比较或排序机制

查询与排序是数据库常用的两个操作,如果能理解 Mongodb 中比较的机制,那么在使用中将会变得更加得心应手。

因此,本文对这些机制进行总结。

不同 BsonType 之间的比较顺序

每一个 bsonType 都有一个 order,当使用不同的 bsonType 进行排序比较时,它们的顺序由低到高为:

  1. MinKey (internal type)
  2. Null
  3. Numbers (ints, longs, doubles, decimals)
  4. Array
  5. Symbol, String
  6. Object
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. MaxKey (internal type)
image-20220829220828067

数字类型比较

Mongodb 将 intlongdoubledecimal 都视作一个类型,在进行比较时,会对它们进行转换。

字符串类型比较

二进制

默认使用二进制来比较字符串

规则(collation)

也可以使用特定语言规则来进行比较。参考 Collaction

数组比较

  • 小于比较或升序排序,先对数组中的元素进行排序(不同的 bsonType 按上述顺序进行排序),然后比较数组中的最小元素
  • 大于大于或降序排序,比较数组的最大元素。
  • 将其值为单元素数组(例如[ 1 ])的字段与非数组字段(例如2)进行比较时,实际比较的是 12
  • 比较空数组(例如[ ])会将空数组视为小于null或缺少字段。

对象比较

对象比较按以下步骤进行:

  1. 按键值对在 BsonObject 中出现的顺序进行比较

  2. 先比较键值(字段值)的类型,如果是不同的 bsonType 的键值按开篇中的顺序进行比较

  3. 如果类型相等,则比较键值

  4. 如果键值相等,则比较键名(字段名)

  5. 如果上述都相等,则继续比较下一个键值对。

    如果键值对存在于对象 A,而不存在于对象 B 中,则 A 大于 B

时间(Date)与时间戳(Timestamp)比较

Date 在 Timestamp 之前排序。

不存在的字段比较

字段为 null 的对象视作对象不存在该字段,例如 {}{a: null} 是相等的。

二进制比较

二进制按如下顺序进行比较:

  1. 先比较数据长度
  2. 然后比较一个字节的 bsonType 类型
  3. 最后再一个字节一个字节的比较

参考

Comparison/Sort Order

Comparison/Sort Order 中文

Collaction