112 votes

Mongoose supprime un élément du tableau dans le document et le sauvegarde.

J'ai un tableau dans mon document modèle. Je voudrais supprimer des éléments de ce tableau en fonction d'une clé que je fournis, 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 a trouvé le document mais la suppression et l'enregistrement ne fonctionnent pas.

171voto

Daniel Flippance Points 853

Vous pouvez également effectuer la mise à jour directement dans MongoDB sans devoir charger le document et le modifier à l'aide de code. Utilisez l'option $pull o $pullAll pour supprimer l'élément du tableau :

Favorite.updateOne({ cn: req.params.name }, {
    $pullAll: {
        favorites: req.params.deleteUid,
    },
});

Pour supprimer des objets du tableau, alors

Favorite.updateOne({ cn: req.params.name }, {
    $pullAll: {
        favorites: [{_id: req.params.deleteUid}],
    },
});

(vous pouvez également utiliser updateMany pour plusieurs documents)

http://docs.mongodb.org/manual/reference/operator/update/pullAll/

86voto

Jason Sebring Points 4309

La réponse cochée fonctionne mais officiellement dans la dernière version de MongooseJS, vous devez utiliser tirer .

doc.subdocs.push({ _id: 4815162342 }) // added
doc.subdocs.pull({ _id: 4815162342 }) // removed

https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-pull

J'étais en train de chercher ça aussi.

Voir la réponse de Daniel pour la réponse correcte. Beaucoup mieux.

14voto

Mike Musni Points 151

Les réponses ci-dessus montrent comment retirer un tableau et voici comment retirer un objet d'un tableau.

Référence : https://docs.mongodb.com/manual/reference/operator/update/pull/

db.survey.update( // select your doc in moongo
    { }, // your query, usually match by _id
    { $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } }, // item(s) to match from array you want to pull/remove
    { multi: true } // set this to true if you want to remove multiple elements.
)

6voto

Roel van Uden Points 1968

Comme les favoris sont un tableau, il suffit de les séparer et d'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);
    });
};

4voto

vipin sharma Points 279

Cela fonctionne pour moi et c'est 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 supprimer le coupon de cette catégorie Array. J'ai un tableau de catégories et j'ai donc utilisé la fonction arrOfSubCategory . Donc je récupère chaque tableau d'objet de ce tableau avec la fonction map avec l'aide de $in opérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X