web-dev-qa-db-fra.com

insertion d'un objet dans un schéma de tableau en Mongoose

J'ai ce schéma de mangouste

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

et essayer de mettre à jour le modèle en procédant comme suit:

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

    });
  });

Je ne déclare pas le messages prendre un tableau d'objets?
ERROR: MongoError: Impossible d'appliquer le modificateur $ Push/$ pushAll à un non-tableau

Des idées?

50
user1460015

mangouste le fait pour vous en une seule opération.

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

N'oubliez pas qu'en utilisant cette méthode, vous ne pourrez pas utiliser les fonctions "pre" du schéma.

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

À partir de la dernière mogoose, findbyidandupdate doit avoir un paramètre facultatif "new: true" ajouté. Sinon, vous obtiendrez l'ancien document. Par conséquent, la mise à jour de Mongoose version 4.x.x est convertie en:

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