2015-11-27 50 views
1

我想使用python和龍捲風訪問單個函數內部的一個表。如何使用批量操作更新mongdb中的文檔?

從我以前的問題的建議,我試圖使用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

你需要.find()你想要什麼.update()

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

而且你找到你的收藏中的文件只需使用.find方法返回一個Cursor對象。然後,您需要遍歷光標或使用list來返回文檔。這是說如果知道你的查詢將只返回一個文件,那麼你需要的是.find_one()方法。

在你打印的bulk.find結果沒有任何意義,因爲你要插入的文件,使用的BulkOperationBuilder相同的情況下,這意味着所有的操作都將經過.execute()

0

如果被髮送到服務器更新你使用的電機,則需要「產量」未來才能返回由bulk.execute等待其完成,並得到一個結果:

@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