with updateitem query node example dynamodb documentclient consultas aws node.js mongoose

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