mongodb中的字符串排序

前言

数据库有一索引字段,ObjectIdstring类型混用。

需要辨明sort后的排序关系。

输入

json 复制代码
[{
  "_id": {
    "$oid": "e98799a7e181225ad5c87476"
  }
},
{
  "_id": {
    "$oid": "e98799a7e181225ad5c87477"
  }
},
{
  "_id": {
    "$oid": "e98799a7e181225ad5c87480"
  }
},
{
  "_id": "e98799a7e181225ad5c87476"
},
{
  "_id": "e98799a7e181225ad5c87476ccd7fc61"
},
{
  "_id": "e98799a7e181225ad5c87478"
},
{
  "_id": "e98799a7e181225ad5c87479"
}]

结论1 混排

经过测试,ObjectIdstring类型混用时,

使用Ascending排序,ObjectId总是排在string之后。
string内部遵循字典序。

python 复制代码
for doc in coll.find({}).sort("_id", pymongo.ASCENDING):
    print(doc)
"""
{'_id': 'e98799a7e181225ad5c87476'}
{'_id': 'e98799a7e181225ad5c87476ccd7fc61'}
{'_id': 'e98799a7e181225ad5c87478'}
{'_id': 'e98799a7e181225ad5c87479'}
{'_id': ObjectId('e98799a7e181225ad5c87476')}
{'_id': ObjectId('e98799a7e181225ad5c87477')}
{'_id': ObjectId('e98799a7e181225ad5c87480')}
"""

结论2 条件比较

在mongo内部,给定string作为比较条件时,只会和string类型直接进行比较。

返回值中不再出现ObjectId类型。

python 复制代码
for doc in coll.find({'_id':{'$gt':'e98799a7e181225ad5c87476'}}).sort("_id", pymongo.ASCENDING):
    print(doc)
"""
{'_id': 'e98799a7e181225ad5c87476ccd7fc61'}
{'_id': 'e98799a7e181225ad5c87478'}
{'_id': 'e98799a7e181225ad5c87479'}
"""

类似地,给定ObjectId作为比较对象时,返回值中也只存在ObjectId类型。

python 复制代码
for doc in coll.find({'_id':{'$gt': ObjectId('e98799a7e181225ad5c87476')}}).sort("_id", pymongo.ASCENDING):
    print(doc)

"""
{'_id': ObjectId('e98799a7e181225ad5c87477')}
{'_id': ObjectId('e98799a7e181225ad5c87480')}
"""

想选中指定类型只需要

python 复制代码
for doc in coll.find({'_id':{'$type':'objectId'}}).sort("_id", pymongo.ASCENDING):
    print(doc)

"""
{'_id': ObjectId('e98799a7e181225ad5c87476')}
{'_id': ObjectId('e98799a7e181225ad5c87477')}
{'_id': ObjectId('e98799a7e181225ad5c87480')}
"""
# or
for doc in coll.find({'_id':{'$type':'string'}}).sort("_id", pymongo.ASCENDING):
    print(doc)

"""
{'_id': 'e98799a7e181225ad5c87476'}
{'_id': 'e98799a7e181225ad5c87476ccd7fc61'}
{'_id': 'e98799a7e181225ad5c87478'}
{'_id': 'e98799a7e181225ad5c87479'}
"""

联合查询

准确地使用 类型指定$type + 比较条件$gt时可以获得返回值。

但如果$type给定string$gt给定ObjectId就会返回空。

python 复制代码
query = { '$and':[{'_id': {'$type': "string"}}, {'_id':{'$gt':'e98'}}]}

"""
{'_id': 'e98799a7e181225ad5c87476'}
{'_id': 'e98799a7e181225ad5c87476ccd7fc61'}
{'_id': 'e98799a7e181225ad5c87478'}
{'_id': 'e98799a7e181225ad5c87479'}
"""

# or
for doc in coll.find({ '$and':[{'_id': {'$type': "objectId"}}, {'_id':{'$gt':ObjectId('e98799a7e181225ad5c87476')}}]}).sort("_id", pymongo.ASCENDING):
    print(doc)

"""
{'_id': ObjectId('e98799a7e181225ad5c87477')}
{'_id': ObjectId('e98799a7e181225ad5c87480')}
"""
相关推荐
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
CodingBrother3 小时前
MySQL 中的 `IN`、`EXISTS` 区别与性能分析
数据库·mysql
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
小小不董4 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
甄臻9244 小时前
Windows下mysql数据库备份策略
数据库·mysql
内蒙深海大鲨鱼4 小时前
qt之ui开发
数据库·qt·ui
不爱学习的YY酱4 小时前
【计网不挂科】计算机网络第一章< 概述 >习题库(含答案)
java·数据库·计算机网络
这样の我5 小时前
hbase集成phoenix
大数据·数据库·hbase
安静读书6 小时前
MongoDB 详解:深入理解与探索
数据库·mongodb
我有一颗薄荷糖6 小时前
Qt--命令行终端程序开发
开发语言·数据库·qt