2015-05-04 70 views
0

我有以下代碼可以找到所有包含輸入電子郵件地址的成員的項目。它的想法是搜索[email protected](作爲示例)並將其更改爲其輸入的名稱。問題修改並保存數組中的值

代碼

Project.find({ _members: req.body.email }, function(err, projects) { 
    for (var i = 0, len = projects.length; i < len; i++) { 
    for (var x = 0, lent = projects[i]._members.length; x < lent; x++) { 
     if (projects[i]._members[x] == ["NF" + req.body.email]) { 
     console.log("FOUND MATCH") 
     projects[i]._members[x].value = req.body.alias 
     projects[i].save() 
     } 
    } 
    } 

控制檯日誌告訴我,比賽已經找到了,但是值永遠不會在陣列中更新。我想知道是否有正確的方法來改變數組中的值而不是僅僅使用=運算符。或者我沒有正確保存文檔?

示例項目文件

"_id" : ObjectId("5546"), 
"name" : "Test project", 
"description" : "This is a sample description", 
"archived" : false, 
"admins" : [ 
     "[email protected]" 
], 
"_members" : [ 
     "[email protected]", 
     "[email protected]" 
], 
"updated" : ISODate("2015=05=04T04:52:22:787Z") 

的想法是用一個名字來更新[email protected]。這個名字來自req.body.alias。

控制檯告訴我找到了匹配,並且沒有發生錯誤,但是沒有進行更新。

+0

你能至少向我們展示一些樣本文檔和預期的輸出? – chridam

回答

0

問:爲什麼我直接更新元素時​​不更改數組?

doc.array[3] = 'changed'; 
doc.save(); 

A.貓鼬不創建getter/setter方法爲數組索引;如果沒有他們,貓鼬永遠不會收到變化的通知,所以不知道要堅持新的價值。解決方法是使用Mongoose> = 3.2.0中提供的MongooseArray#集合。

// 3.2.0 
doc.array.set(3, 'changed'); 
doc.save(); 

// if running a version less than 3.2.0, you must mark the array modified before saving. 
doc.array[3] = 'changed'; 
doc.markModified('array'); 
doc.save(); 

Mongoose FAQ