Mangoose supprimer l'élément array dans le document et enregistrer
j'ai un tableau dans mon document modèle. Je voudrais supprimer des éléments dans ce tableau basé sur une clé que je fournis et puis mettre à jour MongoDB. Est-ce possible?
Voici ma tentative:
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();
});
});
};
Jusqu'à présent, il trouve le document mais le supprimer ou le sauvegarder fonctionne.
5 réponses
vous pouvez également effectuer la mise à jour directement en MongoDB sans avoir à charger le document et à le modifier en utilisant le code. Utilisez le $pull
ou $pullAll
opérateurs pour supprimer l'élément de l'array :
Favorite.update( {cn: req.params.name}, { $pullAll: {uid: [req.params.deleteUid] } } )
http://docs.mongodb.org/manual/reference/operator/update/pullAll/
la réponse cochée fonctionne mais officiellement en MongooseJS dernier, vous devez utiliser pull.
doc.subdocs.push({ _id: 4815162342 }) // added
doc.subdocs.pull({ _id: 4815162342 }) // removed
http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull
je viens de regarder que trop.
voir la réponse de Daniel pour la bonne réponse. Beaucoup mieux.
depuis favoris est un tableau, vous avez juste besoin de splice il off et enregistrer le document.
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);
});
};
cela fonctionne pour moi et vraiment très utile.
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
})
}
})
});
j'ai un modèle dont le nom est SubCategory
et je veux enlever Coupon de cette catégorie de Tableau. J'ai un tableau de catégories, donc j'ai utilisé arrOfSubCategory
. Donc je récupère chaque tableau d'objet de ce tableau avec la fonction map à l'aide de $in
opérateur.
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 vous souhaitez utiliser ...
vous devez appeler 'use strict';
en haut de votre fichier js; :)