2015-06-22 38 views
0

我有一個node.js API構建出來,更新一個子文檔。下面是後呼籲子文檔:如何解決貓鼬對象保存問題?

.put(function(req, res) { 
    member.findById(req.params.member_id, function(err, member) { 
    if (err) 
     res.send(err); 

    console.log("old: " + member); 

    member.address[req.params.address_id].address_type = req.body.address_type; 
    member.address[req.params.address_id].street1 = req.body.street1; 
    member.address[req.params.address_id].street2 = req.body.street2; 
    member.address[req.params.address_id].City = req.body.City; 
    member.address[req.params.address_id].State = req.body.State; 
    member.address[req.params.address_id].Zip = req.body.Zip; 
    member.address[req.params.address_id].Lat = req.body.Lat; 
    member.address[req.params.address_id].Lng = req.body.Lng; 

    console.log("new: " + member); 

    member.save(function(err) { 
     if (err) 
     res.send(err); 

     res.json({message:'Address Updated!!!'}); 
    }) 
    }) 
}) 

兩個的console.log線證明對象是在findById通話發現,然後通過數組會後更新。日誌證明內存中的對象實際上已更新。

但是,在調用.save()調用時,我得到了成功消息,但是在mongodb中沒有任何更改。

我沒有得到任何錯誤,沒有警告,什麼都沒有。它說成功,但沒有改變。 如何解決問題?

這裏是我的地址型號:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema 

var AddressSchema = Schema({ 
    Address_type : String, 
    street1 : String, 
    street2 : String, 
    City : String, 
    State : String, 
    Zip : Number, 
    Lat : Number, 
    Lng : Number 
}); 


module.exports = mongoose.model('Address', AddressSchema); 

和這裏的父模型,成員:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema 

var Address = require('./address'); 
var Award = require('./award'); 

var MemberSchema = Schema({ 
    FName : String, 
    LName : String, 
    address: [Address.Schema], 
    phone : { 
    type : String, 
    number : String 
    }, 
    email: String, 
    gender: String, 
    DOB: Date, 
    rank : { 
    level : String, 
    updated: { type: Date, default: Date.now } 
    }, 
    Awards : { 
    personal : Boolean, 
    award : [Award.Schema], 
    granted: { type: Date, default: Date.now } 
    } 
}); 


module.exports = mongoose.model('Member', MemberSchema); 
+0

完成。非常感謝。 – arcee123

+1

'req.params.address_id'是一個ObjectId還是'address'元素的索引要更新? – JohnnyHK

+0

FWIW,您的錯誤處理已關閉:如果發生錯誤,則調用'res.send(err)',但之後您的回調函數將繼續運行。在這種情況下,您需要從回調中返回:'if(err)return res.send(err)'。 – robertklep

回答

1

當您通過下列方式更新了索引的貓鼬文件的數組元素不會觸發更改陣列的檢測,所以貓鼬不知道保存它(請參閱FAQ)。

手動觸發變化檢測,您可以將您的通話之前調用markModifiedmember.save

member.markModified('address'); 

要幫助解決這些類型的問題,使貓鼬的調試輸出,看看它使本機的實際通話驅動程序通過將以下內容添加到您的啓動代碼中:

mongoose.set('debug', true); 
+0

這是否替換member.save?或者我把這之前member.save? – arcee123

+0

將它放在'member.save'調用之前。 – JohnnyHK

+0

非常感謝。這很好。 – arcee123