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')}
"""
相关推荐
加酶洗衣粉2 小时前
MongoDB部署模式
数据库·mongodb
我要出家当道士2 小时前
MongoDB 备份与恢复综述
mongodb·数据库灾备
Suyuoa2 小时前
mongoDB常见指令
数据库·mongodb
添砖,加瓦2 小时前
MongoDB详细讲解
数据库·mongodb
Zda天天爱打卡2 小时前
【趣学SQL】第二章:高级查询技巧 2.2 子查询的高级用法——SQL世界的“俄罗斯套娃“艺术
数据库·sql
我的运维人生2 小时前
MongoDB深度解析与实践案例
数据库·mongodb·运维开发·技术共享
步、步、为营2 小时前
解锁.NET配置魔法:打造强大的配置体系结构
数据库·oracle·.net
张3蜂3 小时前
docker Ubuntu实战
数据库·ubuntu·docker
神仙别闹3 小时前
基于Andirod+SQLite实现的记账本APP
数据库·sqlite
苏-言3 小时前
MyBatis最佳实践:动态 SQL
数据库·sql·mybatis