Mongo 批量更新不生效
我正在尝试在我的MongoDB上进行一些更新操作。我想使用这里提到的批量更新操作here,但是在使用pymongo时,这个方法对我不起作用。我的代码如下:
import pymongo
client = pymongo.MongoClient()
db = client.test
bulk = db.testCol.initialize_unordered_bulk_op();
bulk.find({"_id":"1,1,1"}).update({"$set":{"attr1":1, "attr2":"X", "attr3":99}})
print bulk.execute()
运行后得到的结果是:
{'nModified': 0, 'nUpserted': 0, 'nMatched': 1, 'writeErrors': [], 'upserted': [], 'writeConcernErrors': [], 'nRemoved': 0, 'nInserted': 0}
根据我的理解,Mongo找到了文档(nMatched=1),但没有进行更新(nModified=0)。我搞不清楚为什么会这样。
当我手动执行这个操作,不使用批量更新时,输出结果似乎是正确的,记录也按要求被修改了。代码如下:
import pymongo
client = pymongo.MongoClient()
db = client.test
print db.testCol.update({"_id":"1,1,1"}, {"attr1":1, "attr2":"X", "attr3":99})
这个方法是有效的,打印的结果和数据库的内容都确认了这一点。
{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}
我就是搞不清楚自己哪里出错了。就我所知,我已经按照正确的步骤执行了批量更新。
1 个回答
0
我写了一个工具函数,可以一次性更新很多数据。
def bulk_update(db, collection_name, update_set_where_list):
"""
:param db: pymongo.database.Database Object
:param collection_name: Collection name
:param update_set_where_list:
:return: full result dictionary
"""
required_keys = ["where", "set"]
bulk = db[collection_name].initialize_unordered_bulk_op()
for update_where_set in update_set_where_list:
if all(key in update_where_set for key in required_keys):
bulk.find(update_where_set["where"]).update({"$set": update_where_set["set"]})
else:
raise Exception("Required key missing. {}".format(required_keys))
return bulk.execute()
比如说,假设在 test
数据库里,有一个叫 myCollection
的集合,我们需要把里面的数据更新一下:把 x 等于 1 的地方,y 更新为 3;把 x 等于 5 的地方,y 更新为 6。
然后调用这个工具函数的方式是这样的:
client = MongoClient('mongodb://localhost:27017/')
db = client['test']
update_set_where_list = [{"where":{"x":1},"set":{"y":3}},{"where":{"x":5},"set":{"y":6}}]
bulk_update(db=db, collection_name="myCollection", update_set_where_list=update_set_where_list)