Python 有效地查询字段范围内缺失的整数?
我有一个数据库用于我正在编写的备份服务。它以增量方式检索消息,这些消息具有连续的数字id。存储在Python 有效地查询字段范围内缺失的整数?,python,mongodb,performance,database,Python,Mongodb,Performance,Database,我有一个数据库用于我正在编写的备份服务。它以增量方式检索消息,这些消息具有连续的数字id。存储在'message\u id'字段中。因此,如果服务上的最后一条消息是消息编号10000,那么一旦备份完成,数据库应该包含10000个文档,每个文档的排序'message\u id's相当于范围(1,10000+1) 我想编写一个查询,生成丢失的消息ID。因此,如果数据库中有9995个文档,并且缺少消息10、15、49、99和1043,它应该返回[10、15、49、99、1043] 我已经完成了以下工作
'message\u id'
字段中。因此,如果服务上的最后一条消息是消息编号10000,那么一旦备份完成,数据库应该包含10000个文档,每个文档的排序'message\u id'
s相当于范围(1,10000+1)
我想编写一个查询,生成丢失的消息ID。因此,如果数据库中有9995个文档,并且缺少消息10、15、49、99和1043,它应该返回[10、15、49、99、1043]
我已经完成了以下工作,仅从数据库中获取ID,并在我的应用程序代码中运行一组交叉点:
def missing_message_ids(self):
"""Return the set of the ids of all missing messages.."""
latest = self.get_latest_message()
ids = set(range(1, latest['_id']+1))
present_ids = set(doc['_id'] for doc in self.db.messages.find({}, {'_id': 1}))
return ids - present_ids
这对我来说是很好的,但是对于大量的消息来说,它似乎太慢了。这更多的是出于好奇而非实际的性能要求:有没有更有效的方法来实现这一点,可能完全是在数据库引擎上实现的?在SQL word中可以使用CTE,在mongo中,我们可以使用聚合和
$lookup
作为一种CTE(公共表表达式)
具有这种数据结构
{
"_id" : ObjectId("575deea531dcfb59af388e17"),
"mesId" : 4.0
}, {
"_id" : ObjectId("575deea531dcfb59af388e18"),
"mesId" : 6.0
}
对于缺少的“mesId”:5.0
,我们可以使用此聚合查询,它将投影所有下一个预期的ID,并加入其中。这里的限制是如果我们在序列中丢失了多条消息,但这可以通过投影下一个Id并再次进行$lookup来扩展
var project = {
$project : {
_id : 0,
mesId : 1,
nextId : {
$sum : ["$mesId", 1]
}
}
}
var lookup = {
$lookup : {
from : "claudiu",
localField : "nextId",
foreignField : "mesId",
as : "missing"
}
}
var match = {
$match : {
missing : []
}
}
db.claudiu.aggregate([project, lookup, match])
和输出:
{
"mesId" : 4.0,
"nextId" : 5.0,
"missing" : []
}