Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove sub-document from Mongo with mongoose

I am trying to remove an item from a collection that is stored in a mongoose document. My document looks like this:

{
  "__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"
    }
  ]
}

I want to remove the goldfish with the sku of 12. I am doing the following:

var inventory = res.locals.content;
inventory.items.remove( {sku: req.params.itemSku}, function (err, item) {
  if (err) {
    console.log('error occurred', err);
    res.send('error');
  }
  else {
    res.send('Item found and deleted');
    return; 
  }
});

when I do this, I get the error "TypeError: Cannot read property 'equals' of undefined". I don't understand why.

like image 309
Brandon Avatar asked Sep 01 '13 00:09

Brandon


People also ask

How do I delete nested data in MongoDB?

To remove an element from a doubly-nested array in MongoDB document, you can use $pull operator. Now field "UserZipCode": "20010" has been removed from a doubly-nested array.

How do I remove a specific element from an array in MongoDB?

To remove an element, update, and use $pull in MongoDB. The $pull operator removes from an existing array all instances of a value or values that match a specified condition.

How do I remove a property from a document in MongoDB?

In MongoDB, you can use the $unset field update operator to completely remove a field from a document. The $unset operator is designed specifically to delete a field and its value from the document.


1 Answers

Subdocuments now have a remove function. Use as follows from the spec:

var doc = parent.children.id(id).remove();
parent.save(function (err) {
  if (err) return handleError(err);
  console.log('the sub-doc was removed')
});
like image 68
Alex Avatar answered Sep 22 '22 03:09

Alex