【问题标题】:How to use bulk upsert in a loop?如何在循环中使用批量更新插入?
【发布时间】:2017-11-03 11:17:17
【问题描述】:

我在 Mongoldb 中的字段是; id、website_url、状态。

我需要找到 website_url 并将其状态更新为 3 并添加一个名为 err_desc 的新字段。

我有一个 website_urls 列表,它的状态和它的 err_desc。

下面是我的代码。

client = MongoClient('localhost', 9000)
db1 = client['Company_Website_Crawl']
collection1 = db1['All']
posts1 = collection1.posts
bulk = posts1.initialize_ordered_bulk_op()
website_url = ["http://www.example.com","http://example2.com/"]
err_desc = ["error1","error2"]
for i in website_url:
    parsed_uri = urlparse(i)
    domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
    final_url = domain
    final_url_strip = domain.rstrip("/")
    print i,final_url,final_url_strip,"\n"
    try:
        k = bulk.find({'website_url':i}).upsert().update({'$push':{'err_desc':err_desc,'status':3}})
        k = bulk.execute()
        print k
    except Exception as e:
        print "fail"
        print e

错误

发生失败批处理操作错误

fail 批量操作只能执行一次。

一开始我用的是

k =  posts1.update({'website_url':final_url_strip},{'$set':{'err_desc':err_desc,'status':3}},multi=True)

对于 500 万条记录来说太慢了。所以我想使用批量更新选项。请帮助我在这种情况下使用批量更新插入。

【问题讨论】:

    标签: python mongodb mongodb-query pymongo


    【解决方案1】:

    错误信息告诉你调用execute()后需要重新初始化批量写入操作。但问题是,你做错了。在您的情况下,您需要在 for 循环的末尾调用 execute,如下所示:

    from itertools import count
    
    
    ct = count()
    
    for url in website_url:
        ...
        try:
            bulk.find({'website_url':i}).upsert().update({'$push':{'err_desc':err_desc,'status':3}})
            val = next(ct)
        except Exception as e:
            ...
    if val > 0:
        bulk.execute()     
    

    另请注意,Bulk() 现在已弃用并替换为 bulkwrite

    【讨论】:

    • 谢谢@S.M.Styvane。我有两个澄清。 1. 另请注意 Bulk() 现在已弃用并替换为批量写入(我不明白您指的是哪里。) 2. pymongo.errors.BulkWriteError: batch op errors occurred 是我遇到的错误。跨度>
    • 看看3.2版本说明herebulkwrite的描述
    • 谢谢@S.M.Styvane。有效。能否请您为我解开另一个疑问。是否有可能找到是否有任何记录失败。例如,如果在数据库中找不到 i 的值,我需要替换另一个值并尝试查找记录并进行更改。有可能吗,如果可以,我该如何处理?
    猜你喜欢
    • 2022-12-21
    • 1970-01-01
    • 2011-09-29
    • 2011-04-15
    • 2020-12-01
    • 2020-12-13
    • 2014-10-06
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多