14 votes

Supprimer un sous-document de Mongo avec mongoose

Je tente de supprimer un élément d'une collection qui est stockée dans un document mongoose. Mon document ressemble à ceci :

{
  "__v": 3,
  "_id": "5221040475f174d59a000005",
  "items": [
    {
      "sku": 1321654654613213,
      "name": "goldfish",
      "quantity": 12,
      "_id": "52224ed5bd9d340000000003"
    },
    {
      "sku": 12,
      "name": "goldfish",
      "quantity": 13,
      "_id": "52225dcbf2f1e40000000003"
    },
    {
      "sku": 1299,
      "name": "goldfish",
      "quantity": 13,
      "_id": "522260b6f2f1e40000000004"
    }
  ]
}

Je veux supprimer le goldfish avec le sku de 12. Je fais ce qui suit :

var inventaire = res.locals.content;
inventaire.items.remove( {sku: req.params.itemSku}, function (err, item) {
  if (err) {
    console.log('une erreur est survenue', err);
    res.send('erreur');
  }
  else {
    res.send('Article trouvé et supprimé');
    return; 
  }
});

Quand je fais ça, j'obtiens l'erreur "TypeError: Cannot read property 'equals' of undefined". Je ne comprends pas pourquoi.

30voto

Alex Points 1381

Les sous-documents ont maintenant une fonction remove. Utilisez comme suit à partir de la spécification :

var doc = parent.children.id(id).remove();
parent.save(function (err) {
  if (err) return handleError(err);
  console.log('le sous-doc a été supprimé')
});

18voto

Peter Lyons Points 47794

Vous voulez inventory.items.pull(req.params.itemSku), suivi d'un appel à inventory.save. .remove est pour les documents de niveau supérieur

9voto

robertfoenix Points 463

Suppression d'un sous-document d'un tableau

La solution la plus agréable et la plus complète que j'ai trouvée pour à la fois trouver et supprimer un sous-document d'un tableau est d'utiliser la méthode $pull de Mongoose :

Collection.findOneAndUpdate(
    { _id: votreCollectionId },
    { $pull: { subdocumentsArray: { _id: subdocumentId} } },
    { new: true },
    function(err) {
        if (err) { console.log(err) }
    }
)

Le {new: true} garantit que la version mise à jour des données est retournée, plutôt que les anciennes données.

7voto

Stan Smith Points 111

Enfin!

MongoDB:

"imgs" : {"other" : [ {
        "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg",
        "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg",
        "_id" : ObjectId("58433bdcf75adf27cb1e8608")
                                    }
                            ]
                    },
router.get('/obj/:id',  function(req, res) {
var id = req.params.id;

Model.findOne({'imgs.other._id': id}, function (err, result) {
        result.imgs.other.id(id).remove();
        result.save();            
    });

2voto

Vous pouvez simplement utiliser $pull pour supprimer un sous-document.

    Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

Cela trouvera votre document parent correspondant à l'ID donné, puis supprimera l'élément de subDocument qui correspond aux critères donnés.

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