从 MongoDB 获取 _ids 列表 - 避免 'distinct too big'

Getting a list of _ids from MongoDB - Avoiding 'distinct too big'

我有一个文件,它从站点地图 .xml 文件中抓取数据,并从每个页面下载一些数据。每次我启动抓取功能时,我都会去这个 xml 获取要抓取的 URL,将它们放在一个列表中,将它们与我已经下载的 url 的列表进行比较,因此只需刮掉其余部分。我使用这些 URL 作为 mongodb:

的 _id
list_of_ids = collection.find().distinct('_id')
start_urls = list(set(new_url_list)-(set(list_of_ids)))

我现在遇到了以下错误:

pymongo.errors.OperationFailure: distinct too big, 16mb cap, full error: {'ok': 0.0, 'errmsg': 'distinct too big, 16mb cap', 'code': 17217, 'codeName': 'Location17217'}

我想我可以遍历数据库并将每个 _id 附加到一个列表中,但是虽然我不是一心想提高性能,但一定有更好的方法吗?

_ids 必须是不同的,所以不确定为什么你需要使用不同的,除非这是一个简单的方法来获得一个没有混乱的列表。

试试这个:

list_of_ids = [x['_id'] for x in collection.find({}, {'_id': 1})]

事实上,如果你想要一套,使用类似的:

set_of_ids = {x['_id'] for x in collection.find({}, {'_id': 1})}

您可以使用 pymongo 的独特功能,直接 returns 您是一个列表

import pymongo
from pymongo import MongoClient

mongo = MongoClient('mongodb://localhost:27017')
db = mongo[dbname][collectionname]

distinct_list = db.distinct('_id')