345 votes

Comment supprimer des documents à l'aide de Node.js Mongoose ?

FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

La méthode ci-dessus ne semble pas fonctionner. Les enregistrements sont toujours là.

Quelqu'un peut-il réparer ?

550voto

Yusuf X Points 5430

Si vous n'avez pas envie d'itérer, essayez

FBFriendModel.find({ id:333 }).remove( callback );

o

FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find renvoie un Demande de renseignements qui a une remove función .

Mise à jour pour Mongoose v5.5.3 - remove() est désormais obsolète. Utilisation deleteOne() , deleteMany() o findOneAndDelete() instead.

4 votes

Ce logiciel fonctionne-t-il avant/après la suppression du logiciel intermédiaire ? (certaines méthodes de modèle contournent l'intergiciel de document et je ne suis pas sûr que ce soit le cas, la documentation n'est pas claire).

13 votes

Je suppose que @hunterloftis l'a déjà compris, mais pour tous ceux qui lisent, la réponse est non, cela n'exécutera pas de middleware pré/post sur des documents individuels.

0 votes

Il semble que de nombreuses autres réponses le mentionnent .exec() mais ce n'est pas du tout le cas. Est .exec() nécessaires, y a-t-il des effets secondaires à l'utilisation de ce produit ou non ?

315voto

diosney Points 3111

MISE À JOUR : version de Mongoose (5.5.3)

remove() est obsolète et vous pouvez utiliser deleteOne(), deleteMany() ou bulkWrite() à la place.

Depuis le "mongoose": ">=2.7.1" vous pouvez supprimer le document directement à l'aide de la fonction .remove() plutôt que de trouver le document et de le supprimer, ce qui me semble plus efficace et plus facile à maintenir.

Voir exemple :

Model.remove({ _id: req.body.id }, function(err) {
    if (!err) {
            message.type = 'notification!';
    }
    else {
            message.type = 'error';
    }
});

UPDATE :

Comme la mangouste 3.8.1 Il existe plusieurs méthodes qui vous permettent de supprimer directement un document, par exemple :

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Se référer à Documentation sur l'API de la mangouste pour plus d'informations.

13 votes

Comme indiqué dans d'autres commentaires à d'autres réponses, cela permet de contourner l'intergiciel défini sur le schéma et peut s'avérer très dangereux. Ne l'utilisez donc que si vous comprenez l'impact que cela aura. Pour plus d'informations, voir mongoosejs.com/docs/middleware.html

2 votes

Pour information, jusqu'à présent, je les ai toujours utilisés sans effets secondaires, bien que je n'aie pas eu à utiliser d'intergiciel dans mes projets :)

8 votes

remove(query) pourrait potentiellement vider l'ensemble de votre collection si vous passez accidentellement query = {} . C'est pourquoi je préfère findOneAndRemove(query) si je ne fais qu'enlever un document.

54voto

mtkopone Points 1607

docs est un tableau de documents, il n'a donc pas de fonction mongooseModel.remove() méthode.

Vous pouvez itérer et supprimer chaque document du tableau séparément.

Ou - puisqu'il semble que vous recherchiez les documents par un identifiant (probablement) unique - utilisez findOne au lieu de find .

6 votes

Étant donné que cette réponse suppose une version assez ancienne de la mangouste, je ne verrais pas d'inconvénient à ce que quelqu'un modifie la réponse acceptée.

0 votes

C'est en fait l'une des meilleures façons de procéder, car elle permet d'invoquer correctement les logiciels intermédiaires définis sur le schéma - voir mongoosejs.com/docs/middleware.html . Vous ne devriez utiliser les autres méthodes que si vous n'utilisez PAS d'intergiciel dans votre application, et alors avec prudence.

50voto

José Pinto Points 36

Pour moi, c'est la meilleure version à partir de la version 3.8.1 :

MyModel.findOneAndRemove({field: 'newValue'}, function(err){...});

Et cela ne nécessite qu'un seul appel à la base de données. Utilisez-la si vous n'effectuez pas de remove les actions préalables à la recherche et à l'éloignement.

1 votes

Tant que vous n'avez pas besoin d'effectuer pre 'remove' actions, il fonctionne bien.

31voto

Sandro Munda Points 12808

Il suffit de faire

FBFriendModel.remove().exec();

1 votes

Cela renvoie-t-il une promesse ? Si oui, quel objet est défini lorsque la promesse est résolue ?

0 votes

@KennyWorden une approche efficace pour trouver la réponse -> mongoosejs.com/docs/api.html puis recherchez ce que vous voulez mais ajoutez '#' à la recherche dans la page avec votre navigateur, par exemple recherchez '#save' et vous verrez qu'il renvoie une promesse.

4 votes

C'est une réponse un peu dangereuse si l'on ne met pas la condition spécifiée par l'opérateur dans l'enlèvement...

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