4 votes

Mongoose - suppression des éléments du tableau DBref et de l'élément lui-même

J'ai un schéma qui ressemble un peu à ça :

var postSchema = new Schema({
   created: { type: Date, default: Date.now },
   updated: { type: Date, default: Date.now },
   comments: { type: [Schema.ObjectId], ref: 'Comment' }
});

Ainsi, ma collection de commentaires est une collection d'identifiants d'objets faisant référence à mon schéma/collection de commentaires.

J'ai besoin de supprimer certains d'entre eux sur la requête, donc j'essaie ceci :

var comments = [1, 2, 4];    

Post.update({ _id: post_id}, {'$pullAll': {comments: comments }})
  .exec(function(err) {
     // How to remove documents with 1, 2, 4 ids from a Comment collection properly
});

Après avoir exécuté le code ci-dessus, j'ai supprimé un certain nombre de commentaires d'un Post.comments, mais je dois également supprimer ces commentaires d'une collection 'Comments'. Comment dois-je faire ?

EDITAR: Comment puis-je obtenir les identifiants des documents qui n'ont pas été supprimés en fait. Un exemple simple :

Post.comments = [1, 2, 3]; 
Post.update({ _id: post_id}, {'$pullAll': {comments: [1,2]}});

Dans le code ci-dessus, un Post.comments a 1,2,3 seulement, mais nous essayons de tirer [1,2], donc j'ai besoin de savoir que id=3 n'existe pas dans Post.comments et je n'ai pas besoin de le supprimer de la collection 'Comments'.

1voto

JohnnyHK Points 61191

Utilisez le $in opérateur pour cela :

var comments = [1, 2, 4];    

Post.update({ _id: post_id}, {'$pullAll': {comments: comments }})
  .exec(function(err) {
    Comment.remove({ _id: { $in: comments }}, function(err, numberRemoved) {
      // The identified comments are now removed.
    });
  });
});

1voto

jmikola Points 4225

Vous pouvez utiliser le findAndModify pour effectuer la mise à jour et renvoyer le document original dans le dossier de l'utilisateur. value du résultat de la commande. Vous ne devriez pas avoir de problème pour comparer les résultats comments avec les numéros d'identification de votre $pullAll pour discerner les identifiants qui ont été effectivement supprimés.

$ mongo
MongoDB shell version: 2.2.0-rc1
connecting to: test
> db.posts.drop()
true
> db.posts.insert({ _id: 1, comments: [1,2,3] })
> db.runCommand({
... findAndModify: "posts",
... query: { _id: 1 },
... update: { $pullAll: { comments: [1,2,4] }},
... })
{
    "value" : {
        "_id" : 1,
        "comments" : [
            1,
            2,
            3
        ]
    },
    "lastErrorObject" : {
        "updatedExisting" : true,
        "n" : 1
    },
    "ok" : 1
}

Comme JohnnyHK l'a mentionné dans sa réponse, la suppression des documents de commentaires eux-mêmes est mieux réalisée avec un fichier remove() requête et $in opérateur.

Note : mon exemple ci-dessus utilise le shell Mongo JS. Il semble que Mongoose ait récemment obtenu une méthode d'aide pour findAndModify (voir : PR #803 ), bien que vous puissiez toujours exécuter la commande de base de données si celle-ci n'est pas disponible dans la version que vous utilisez.

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