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')}
"""
相关推荐
SelectDB1 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence2 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头2 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠6 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_12 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家13 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_9620664915 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext16 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界17 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统