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.

1voto

    const deleteitem = (req, res) => {
    var id = req.body.id
    var iditem = req.body.iditem

    Venta.findOne({'_id': id}, function(err,result){
        if (err) {
            console.log(err);            
        }else{
            result.items.pull(iditem)
            result.save()
        }
    })}
module.exports = {deleteitem }

0voto

Linus Gubenis Points 1

Vous n'avez pas besoin de l'_id du parent. Vous pouvez simplement rechercher un parent qui a un enfant avec un identifiant spécifique et extraire cet enfant avec le code suivant :

const result = await User.updateOne(
  // Interroger la collection d'utilisateurs pour un document
  // avec un enfant dans son tableau de comptes avec un _id de ChildAccountId.
  { 'accounts._id': 'ChildAccountId' },
  {
    // Dans le document parent trouvé :
    $pull: { // retirer quelque chose de :
      comptes: { // le tableau de comptes
        _id: 'ChildAccountId' // qui a l'_id de ChildAccountId.
      }
    }
  }
);

résultat dans ce cas aura un objet de réponse similaire à celui-ci :

{
  reconnu: true,
  countModifier: 1,
  upsertedId: null,
  upsertedCount: 0,
  countCorrespondant: 1
}

Vous pouvez donc facilement vérifier result.modifiedCount pour voir combien de Sous-documents (dans ce cas) ont été modifiés (où des éléments ont été retirés).

0voto

NOTE -

De mongoose 6.3.1 docs -

Lors de l'exécution d'une requête avec une fonction de rappel, vous spécifiez votre requête sous forme de document JSON. La syntaxe du document JSON est la même que celle de l'environnement shell de MongoDB.

.

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