mongodb - fields - mongoose strict
empujando el objeto dentro del esquema de matriz en Mongoose (1)
Tengo este esquema de mangosta
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 mangosta 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);
}
);