2013-02-26 51 views
0

我更新記錄在我的收藏,像這樣:更新的高效MongoDB中/ pymongo(也許就地?)記錄

for document in myDB.find(): 
    if compliesToSomeRule(document): 
     myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}}) 

這是最有效的方式做到這一點?

這似乎很奇怪,我必須將更新的第一個參數設置爲文檔的_id,因爲是重新查詢索引?

有沒有辦法更新「到位」可以這麼說?

回答

0

您正在更新。更新的第一個參數是find子句,這就是它如何識別要更新的記錄。

編輯

不MongoDB的手柄緩存? 是的。 MongoDB將最近使用的所有數據都保存在RAM中。如果您爲 查詢創建索引,並且您的工作數據集適合內存,則MongoDB將爲來自內存的所有 查詢提供服務。

MongoDB不實現查詢緩存:MongoDB直接從索引和/或數據文件提供所有查詢 。


而且,您的用戶名是真棒:)

+0

但發現子句來請記錄一下......這已經被發現了嗎?也許不是。 p.s. - 最好的XKCD呃? :D – LittleBobbyTables 2013-02-26 16:21:45

+0

我認爲Ian得到的是更新調用的第一部分正在執行「compliesToSomeRule」部分。在這種情況下,它是說document._id == expected_id,非常基本/簡單。但是你可以這樣做:myDB.update({'a':0},{'$ set':....})。在這種情況下,你指定了一個== 0。做這個更新會修改任何一個== 0的文檔,它和你的「compliesToSomeRule」方法相同。編輯:我要寫一個更完整的答案... – ACE 2013-02-26 22:37:01

1

您做出更新命令的第一部分基本上是你從「compliesToSomeRule」方法想要什麼。例如,讓我們說compliesToSomeRule定義如下:

def compliesToSomeResult(doc): 
    if doc['a'] == 0: 
     return True 
    else: 
     return False 

那麼你可以跳過這一套,只是做

myDB.update({ 'a' : 0 }, {'$set' : { 'x' : 'y' }}) 

這就將你的更新文檔(第二個)適用於所有文件您的收藏中有一個字段等於0

又如:如果你想找到的所有文件,其中「A」> 0,你可以做

myDB.update({ 'a' : { '$gt' : 0 }}, {'$set' : {'x' : 'y'}}) 

更新調用的第一部分「查詢」部分是您如何指定哪些文檔接收更新。第二部分定義了實際更新的內容。

這裏是在審查這些材料,你可能會發現有用的文檔:http://docs.mongodb.org/manual/applications/update/

+0

這是一個好主意。但通常我的compilesToSomeRule函數非常複雜,並且可能很難作爲finder參數的一部分來實現:/ – LittleBobbyTables 2013-02-26 23:00:49

+0

啊,這確實會讓事情變得更加困難,也許如果您將示例函數描述爲您想要執行的操作,我們可能會能夠拿出一個好的解決方案。話雖如此,我經常建議人們在客戶端進行復雜的操作,所以也許您最初的解決方案(您的問題中的問題)是解決此問題的最佳方法。 – ACE 2013-02-26 23:19:25

-1

,如果你需要找到一個特定的文件,然後添加一些東西:

flag=db.foo.find({"_id":333}) 
    try: 
     if flag[0]['_id']: 
      db.foo.update({"_id":333},{"$set":{"name":"mongo"}}) 
    except: 
     print "none" 

,但如果你需要搜索的所有文件,並添加東西都:

flag=db.foo.find() 
for row in flag: 
    db.foo.update({"_id":flag['_id']},{"$set":{"name":"mongo"}})