[英]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.