Mongo批量更新无法正常工作

时间:2014-07-03 13:27:43

标签: python mongodb pymongo bulkupdate

我正在尝试在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)。我无法弄清楚为什么会这样做。

当我手动执行操作而不使用Bulk时,输出似乎是正确的,并且记录按要求修改。 代码:

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 :(得分: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()

例如,考虑myCollection数据库中的test集合需要更新,其中y = 3,其中x = 1,y = 6,其中x = 5。

然后调用实用程序函数看起来像

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)