我正在尝试使用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>
任何人都可以指导我如何进行批量操作。
答案 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