2015-06-22 1 views
0

У меня есть node.js api, который обновляет поддокумент. Ниже приводится запись вызов для поддокумента:Как устранить проблему сохранения объекта mongoose?

.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

При обновлении элемента массива документа Mongoose через его индекс это не приводит к срабатыванию изменить обнаружение массива, чтобы Mongoose не знал, чтобы сохранить его (см. FAQ).

Чтобы вручную запустить обнаружение изменений, вы можете вызвать markModified перед вашим вызовом member.save:

member.markModified('address'); 

Чтобы устранить эти типы проблем, включить отладочный вывод мангуста, чтобы увидеть реальные вызовы он делает на родной используя следующую информацию о своем старте:

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

это заменит member.save? или я помещаю это до member.save? – arcee123

+0

Поместите его перед вызовом 'member.save'. – JohnnyHK

+0

Большое вам спасибо. Это отлично работает. – arcee123

 Смежные вопросы

  • Нет связанных вопросов^_^