Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地查询字段范围内缺失的整数?_Python_Mongodb_Performance_Database - Fatal编程技术网

Python 有效地查询字段范围内缺失的整数?

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] 我已经完成了以下工作

我有一个数据库用于我正在编写的备份服务。它以增量方式检索消息,这些消息具有连续的数字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]

我已经完成了以下工作,仅从数据库中获取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" : []
}