node.js - updateitem - Mangosta eliminar elemento de matriz en el documento y guardar
lambda dynamodb example (5)
Tengo una matriz en mi documento modelo. Me gustaría eliminar elementos en esa matriz en función de una clave que proporciono y luego actualizar MongoDB. es posible?
Aquí está mi intento:
var mongoose = require(''mongoose''),
Schema = mongoose.Schema;
var favorite = new Schema({
cn: String,
favorites: Array
});
module.exports = mongoose.model(''Favorite'', favorite, ''favorite'');
exports.deleteFavorite = function (req, res, next) {
if (req.params.callback !== null) {
res.contentType = ''application/javascript'';
}
Favorite.find({cn: req.params.name}, function (error, docs) {
var records = {''records'': docs};
if (error) {
process.stderr.write(error);
}
docs[0]._doc.favorites.remove({uid: req.params.deleteUid});
Favorite.save(function (error, docs) {
var records = {''records'': docs};
if (error) {
process.stderr.write(error);
}
res.send(records);
return next();
});
});
};
Hasta el momento encuentra el documento pero el quitarlo o guardarlo funciona.
Como los favoritos son una matriz, solo necesita empalmarlos y guardar el documento.
var mongoose = require(''mongoose''),
Schema = mongoose.Schema;
var favorite = new Schema({
cn: String,
favorites: Array
});
module.exports = mongoose.model(''Favorite'', favorite);
exports.deleteFavorite = function (req, res, next) {
if (req.params.callback !== null) {
res.contentType = ''application/javascript'';
}
// Changed to findOne instead of find to get a single document with the favorites.
Favorite.findOne({cn: req.params.name}, function (error, doc) {
if (error) {
res.send(null, 500);
} else if (doc) {
var records = {''records'': doc};
// find the delete uid in the favorites array
var idx = doc.favorites ? doc.favorites.indexOf(req.params.deleteUid) : -1;
// is it valid?
if (idx !== -1) {
// remove it from the array.
doc.favorites.splice(idx, 1);
// save the doc
doc.save(function(error) {
if (error) {
console.log(error);
res.send(null, 500);
} else {
// send the records
res.send(records);
}
});
// stop here, otherwise 404
return;
}
}
// send 404 not found
res.send(null, 404);
});
};
Esto está funcionando para mí y realmente es muy útil.
SubCategory.update({ _id: { $in:
arrOfSubCategory.map(function (obj) {
return mongoose.Types.ObjectId(obj);
})
} },
{
$pull: {
coupon: couponId,
}
}, { multi: true }, function (err, numberAffected) {
if(err) {
return callback({
error:err
})
}
})
});
Tengo un modelo cuyo nombre es SubCategory
y quiero quitar el cupón de esta categoría Array. Tengo una variedad de categorías, así que he usado arrOfSubCategory
. Así que busco cada conjunto de objetos de esta matriz con la función de mapa con la ayuda del operador $in
.
La respuesta comprobada funciona, pero oficialmente en MongooseJS, debes usar pull .
doc.subdocs.push({ _id: 4815162342 }) // added
doc.subdocs.pull({ _id: 4815162342 }) // removed
http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull
Yo solo estaba buscando eso también.
Vea la respuesta de Daniel para la respuesta correcta. Mucho mejor.
También puede hacer la actualización directamente en MongoDB sin tener que cargar el documento y modificarlo usando el código. Utilice los operadores $pull
o $pullAll
para eliminar el elemento de la matriz:
Favorite.update( {cn: req.params.name}, { $pullAll: {uid: [req.params.deleteUid] } } )
http://docs.mongodb.org/manual/reference/operator/update/pullAll/
keywords = [1,2,3,4];
doc.array.pull(1) //this remove one item from a array
doc.array.pull(...keywords) // this remove multiple items in a array
si desea usar ...
debe llamar a ''use strict'';
en la parte superior de tu archivo js; :)