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.

30
demandé sur occasl 2013-02-08 04:28:56

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/

62
répondu Daniel Flippance 2015-01-13 08:01:32

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.

31
répondu Jason Sebring 2015-09-08 20:29:32

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);
    });
};
5
répondu Roel van Uden 2013-10-26 23:37:57

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.

2
répondu vipin sharma 2016-09-24 05:01:28
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; :)

1
répondu crazy_phage 2016-06-06 04:58:18