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')}
"""
相关推荐
这个DBA有点耶9 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G9 小时前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备9 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远9 小时前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_9622186111 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren11 小时前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安12 小时前
MySQL-触发器
数据库·mysql
白远山12 小时前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro12 小时前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_9651481112 小时前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘