empujando el objeto dentro del esquema de matriz en Mongoose

Tengo este esquema de 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 }); 

e intentando actualizar el modelo haciendo esto:

 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); }); }); 

¿No estoy declarando los messages para tomar una variedad de objetos?
ERROR: MongoError: No se puede aplicar el modificador $ push / $ pushAll a no matriz

¿Algunas ideas?

la mongoose hace esto por ti en una sola operación.

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

Tenga en cuenta que al usar este método, no podrá hacer uso de las funciones “pre” del esquema.

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

A partir de la última mogoose findbyidandupdate, debe agregarse un parámetro “nuevo: verdadero”. De lo contrario, le devolverán el documento antiguo. Por lo tanto, la actualización de Mongoose Version 4.xx se convierte en:

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