首页 > 解决方案 > 遍历 pymongo 游标需要无限时间

问题描述

我正在使用 pymongo 从 mongo 服务器访问数据。服务器有数十亿个文档,所以我使用 find 和 skip 一次访问 n 个文档。我只需要访问那些将“sample_key_XYZ”作为_tag 的文档。

print('start',datetime.datetime.now())
a=db.collection.find({"_tag":re.compile('latest')}).skip(2000000).limit(2000)
print('end',datetime.datetime.now())

它工作正常光标在一秒钟内移动。但是当我尝试访问数据时它卡住了(需要几个小时才能执行)即

print('start',datetime.datetime.now())

    a=db.collection.find({"_tag":re.compile('sampe_key')}).skip(2000000).limit(2000)
    for doc in a:
        print(doc["_tag"])
        break
    print('end',datetime.datetime.now())

但是如果我将跳过更改为一个小数字(2500),它的执行速度非常快(1s)

('start', datetime.datetime(2019, 4, 1, 16, 59, 3, 685992)) ('end', datetime.datetime(2019, 4, 1, 16, 59, 3, 686293)) 使用时没有文档遍历。

标签: mongodbpython-2.7pymongo

解决方案


根据您的描述,尤其是随着跳数的增加,它的速度会大大降低,我怀疑您遇到了这个问题。查看票证中的描述并检查您是否看到大量扫描的对象/文档。根据我的经验,这可能是您遇到的问题 - 基本上 MongoDB 是在跳过文档之前获取文档。

如果确实如此,则修复方法是升级到 3.6 的更高版本,因为此问题已在 3.6.9 中修复。


推荐阅读