mongodb中的字符串排序

前言

数据库有一索引字段,ObjectIdstring类型混用。
需要辨明sort后的排序关系。

输入

[{
  "_id": {
    "$oid": "e98799a7e181225ad5c87476"
  }
},
{
  "_id": {
    "$oid": "e98799a7e181225ad5c87477"
  }
},
{
  "_id": {
    "$oid": "e98799a7e181225ad5c87480"
  }
},
{
  "_id": "e98799a7e181225ad5c87476"
},
{
  "_id": "e98799a7e181225ad5c87476ccd7fc61"
},
{
  "_id": "e98799a7e181225ad5c87478"
},
{
  "_id": "e98799a7e181225ad5c87479"
}]

结论1 混排

经过测试,ObjectIdstring类型混用时,
使用Ascending排序,ObjectId总是排在string之后。
string内部遵循字典序。

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类型。

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

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

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

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

想选中指定类型只需要

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就会返回空。

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')}
"""

相关推荐

  1. mongodb字符串排序

    2024-03-29 10:48:03       21 阅读
  2. Python 字符串列表排序

    2024-03-29 10:48:03       10 阅读
  3. MongodbObjectId

    2024-03-29 10:48:03       34 阅读
  4. MongoDB 事务

    2024-03-29 10:48:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-29 10:48:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-29 10:48:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-29 10:48:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-29 10:48:03       20 阅读

热门阅读

  1. vivado 调试术语

    2024-03-29 10:48:03       19 阅读
  2. 车流量智能监测识别系统---豌豆云

    2024-03-29 10:48:03       18 阅读
  3. C语言条件编译详解

    2024-03-29 10:48:03       21 阅读
  4. 基于easyx库的C/C++游戏编程实例-贪吃蛇|

    2024-03-29 10:48:03       20 阅读
  5. Kafka客户端快速使用

    2024-03-29 10:48:03       22 阅读
  6. Rustdesk客户端编译后固定密码不稳定时好时坏

    2024-03-29 10:48:03       23 阅读
  7. Linux查看某个指定进程命令

    2024-03-29 10:48:03       21 阅读
  8. docker快速安装单节点和多点MongoDB副本集

    2024-03-29 10:48:03       21 阅读
  9. 【AI】安装web UI时总是报找不到yaml

    2024-03-29 10:48:03       19 阅读