将对象推入Mongoose中的数组模式

我有这个mongoose模式

var mongoose = require('mongoose'); var ContactSchema = module.exports = new mongoose.Schema({ name: { type: String, required: true }, phone: { type: Number, required: true, index: {unique: true} }, messages: [ { title: {type: String, required: true}, msg: {type: String, required: true} }] }, { collection: 'contacts', safe: true }); 

并试图通过这样更新模型:

 Contact.findById(id, function(err, info) { if (err) return res.send("contact create error: " + err); // add the message to the contacts messages Contact.update({_id: info._id}, {$push: {"messages": {title: title, msg: msg}}}, function(err, numAffected, rawResponse) { if (err) return res.send("contact addMsg error: " + err); console.log('The number of updated documents was %d', numAffected); console.log('The raw response from Mongo was ', rawResponse); }); }); 

我是我没有声明messages采取一个对象的数组?
错误: MongoError:无法将$ push / $ pushAll修饰符应用于非数组

有任何想法吗?

mongoose在一次手术中为你做这个。

 Contact.findByIdAndUpdate( info._id, {$push: {"messages": {title: title, msg: msg}}}, {safe: true, upsert: true}, function(err, model) { console.log(err); } ); 

请记住,使用这种方法,您将无法使用模式的“预”function。

http://mongoosejs.com/docs/middleware.html

作为最新的mogoose,findbyid和update需要添加一个“new:true”可选参数。 否则,你会得到旧的文档返回给你。 因此,Mongoose Version 4.xx的更新转换为:

 Contact.findByIdAndUpdate( info._id, {$push: {"messages": {title: title, msg: msg}}}, {safe: true, upsert: true, new : true}, function(err, model) { console.log(err); } );