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')}
"""
相关推荐
是Yu欸14 小时前
vLLM 0.11.0 新特性解析:视觉推理精度跃升与长序列性能革新
数据库·qwen·昇腾·npu·vllm
不屈的铝合金14 小时前
MySQL 数据库服务多实例部署指南
运维·数据库·mysql·多实例部署·维度隔离
杨云龙UP15 小时前
SQL Server定时自动备份配置:使用SSMS维护计划向导配置数据库每日自动备份_20260101
运维·服务器·数据库·sql·sqlserver·桌面
jjjxxxhhh12315 小时前
【项目】-添加辐射源点的接口
数据库
酸菜牛肉汤面15 小时前
21、MySQL中InnoDB的行锁是怎么实现的?
数据库
麦聪聊数据16 小时前
解构“逻辑数据仓库 (LDW)”与数据虚拟化
数据库·数据仓库·sql
天然玩家16 小时前
【数据库知识】MySQL演进/迭代5.x 8.0 9.5
数据库·mysql
降临-max16 小时前
JavaWeb企业级开发---MySQL
java·开发语言·数据库·笔记·后端·mysql
代码不停16 小时前
MySQL索引和视图
数据库·mysql
Ahtacca16 小时前
Redis 五大常用数据类型详解及 Java 客户端(RedisTemplate)操作实战
java·数据库·redis·学习·缓存