簡體   English   中英

如何在循環中使用批量上載?

[英]How to use bulk upsert in a loop?

我在Mongoldb擁有的領域是; ID,網站網址,狀態。

我需要找到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

錯誤

發生批生產操作錯誤失敗

失敗批量操作只能執行一次。

最初我用

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

5M記錄太慢了。 所以我想使用批量更新選項。 請幫助我在這種情況下使用批量增補。

錯誤消息告訴您,需要在調用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代替

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM