2013-04-01 262 views
1

的基本思路是這樣的:貓鼬:更新不工作

model.find({}, function(err, docs) { 
    docs.forEach(function(doc) { 
     // update it with whatever new object 
     model.update({"category":"cat1"}); 
    }); 
}); 

現在的問題是任何種類的更新/保存不起作用。我可以找到,計數等模型。我試過doc.save()model.findOneAndUpdate(),使用特定領域的$set參數,他們不工作。我去了mongo shell並用參數輸入了update命令,它工作正常。

有一次,它的工作,是當我試圖從find()的回調函數以外使用var m = new model({..})m.save()新文檔。但我需要根據他們的領域找到文件,並更新這些文件。

我覺得我失去了一些東西真的很基本的,可能有人幫助我嗎?

編輯:mongoose.disconnect()是在代碼被調用以後。所以查詢沒有執行。

+0

你確定更新函數實際上是被調用的嗎?就像你把'console.log()'放在更新的上方,讓你知道這行正在執行? – Chad

+0

我在更新函數之外完成了每個文檔名稱的確認。我甚至在回調中放了一個console.log。有趣的是,回調正在執行,但我沒有看到它反映在數據庫中。 – Raghuveer

回答

0

除非它只是一個錯字,你做了錯誤的對象上的更新。你可能想要做

model.find({},功能(ERR,文檔){ docs.forEach(函數(DOC){ doc.update({/ 此領域 /}); }); });

上面的回答不正確。

編輯

思考一些關於它,你爲什麼這樣做find的畢竟?你應該可以在沒有它的情況下更新你的docoments。檢查API docs for update

model.update({}, {field1: 'updated value'}, function(err) {}); 
+0

沒錯,但我無法在回調中做到這一點。我使用一些隨機值將更新代碼放在find({})回調之外,並且它工作得很好。在貓鼬中更新這種方式是可以撤銷的嗎?我對它仍然很陌生。 – Raghuveer

+0

當我想起它時,爲什麼你會發現呢?你應該可以用正確的參數調用'update'。 – NilsH

+0

因爲我在修改每個文檔。舉例來說,doc.value = oldvalue ++。所以我想我必須得到每個文檔,根據需要進行修改並將新文檔推入數據庫。 – Raghuveer

2

另一種可能的原因這個問題是當你使用混合類型,如Schema.Types.Mixed。如果您只更新混合字段,則Mongoose不知道您已更新該字段。所以,你需要調用markModified

我最近遇到了這一點,它是在頸部疼痛,找出發生了什麼事情。