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