如何使用批量操作更新mongdb中的文档?

时间:2015-11-27 07:31:16

标签: python mongodb mongodb-query pymongo

我正在尝试使用python和tornado访问单个函数内的单个表。

根据我之前提问的建议,我尝试使用Bulk中提供的mongodb操作来执行此操作。我尝试插入是成功的,但在更新过程中出现错误。

我的代码是

bulk = db.Test.initialize_unordered_bulk_op()
print("1")
bulk.insert({"test":"we"})
# bulk.find({"test": "we"})
bulk.update({"test": "we"},{'$set':{"test": "false"}},{'$unset':{"Cid"}})
t = bulk.execute()
print(t)

查询中有问题吗?

当尝试打印find操作的答案时,

<tornado.concurrent.Future object at 0x02ED2630>

任何人都可以指导我如何进行批量操作。

2 个答案:

答案 0 :(得分:2)

您需要.find()想要.update()

bulk.find({"test": "we"}).update({'$set': {"test": "false"}, '$unset': {"Cid", ""}})

您还可以在集合中查找文档,只需使用返回Cursor对象的.find方法。然后,您需要迭代光标或使用list返回文档。如果知道您的查询只返回一个文档,那么您需要的是.find_one()方法。

在您的打印中,bulk.find的结果没有任何意义,因为您正在插入文档,使用BulkOperationBuilder的相同实例进行更新,这意味着您的所有操作都将被发送到服务器在.execute()之后

答案 1 :(得分:0)

如果您正在使用Motor,则需要“产生”bulk.execute返回的Future,以便等待其完成并获得结果:

@gen.coroutine
def f():
    bulk = db.Test.initialize_unordered_bulk_op()
    print("1")
    bulk.insert({"test":"we"})
    # bulk.find({"test": "we"})
    bulk.update({"test": "we"},{'$set':{"test": "false"}},{'$unset':{"Cid"}})
    t = yield bulk.execute()
    print(t)

电机是异步的;为了等待与数据库服务器通信的任何Motor方法完成,您必须将回调传递给方法,或者产生方法返回的Future。

有关更多信息,请参阅教程:

http://motor.readthedocs.org/en/stable/examples/bulk.html#ordered-bulk-write-operations