【问题标题】:Getting a list of _ids from MongoDB - Avoiding 'distinct too big'从 MongoDB 获取 _id 列表 - 避免“明显太大”
【发布时间】:2021-03-14 10:46:43
【问题描述】:

我有一个文件,它从站点地图 .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 附加到一个列表中,但是虽然我并不热衷于性能,但一定有更好的方法吗?

【问题讨论】:

    标签: python mongodb list pymongo distinct


    【解决方案1】:

    _ids 必须是不同的,所以完全不知道为什么需要使用 distinct,除非它是一种简单的方法来获得一个没有混乱的列表。

    试试这个:

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

    其实如果你想要一个集合,使用类似的:

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

    【讨论】:

      【解决方案2】:

      pymongo 的独特功能可以直接返回一个列表

      import pymongo
      from pymongo import MongoClient
      
      mongo = MongoClient('mongodb://localhost:27017')
      db = mongo[dbname][collectionname]
      
      distinct_list = db.distinct('_id')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-20
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 2022-10-17
        相关资源
        最近更新 更多