Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在循环中使用批量升级?_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python 如何在循环中使用批量升级?

Python 如何在循环中使用批量升级?,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我在蒙古的土地是; id、网站地址、状态 我需要找到网站的url并将其状态更新为3,然后添加一个名为err_desc的新字段 我有一个网站URL列表,它的状态和错误描述 下面是我的代码 client = MongoClient('localhost', 9000) db1 = client['Company_Website_Crawl'] collection1 = db1['All'] posts1 = collection1.posts bulk = posts1.initialize_or

我在蒙古的土地是; id、网站地址、状态

我需要找到网站的url并将其状态更新为3,然后添加一个名为err_desc的新字段

我有一个网站URL列表,它的状态和错误描述

下面是我的代码

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)

这对500万张唱片来说太慢了。所以我想使用批量更新选项。请帮助我在此场景中使用批量升级

错误消息告诉您需要在调用后重新初始化批写入操作。但问题是,你做错了。在您的情况下,需要在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()
现在已被弃用,并被

Thank@S.M.Styvane所取代。我有两个澄清。1.另外请注意,Bulk()现在已被弃用,并被bulkwrite取代(我不明白您指的是什么)。pymongo.errors.BulkWriteError:batch op errors Occursed就是我遇到的错误。请查看3.2发行说明中对bulkwrite的描述,谢谢@S.M.Styvane。成功了。你能帮我澄清另一个疑问吗。是否有可能发现任何记录失败。例如,如果在数据库中找不到i的值,我需要替换另一个值,然后尝试查找记录并进行更改。有可能吗?如果有,我如何处理?