Sameer Ds
Sameer Ds

Reputation: 81

need to delete an element from array nodejs and mongodb

enter image description here

how do i delete a productid say 5bbee0b7e5fcb61df834f7d6 from this arrat have tried

router.post('/empty-cart', isLoggedIn, function(req, res, next) {
  console.log("user" + req.body.user + ",product" + req.body.productId);
  slug = req.body.productId;
  user = req.body.user;
  User.findOne({ _id: user }, {
    $pull: { productId: slug }
  }, function(err, model) {})

  console.log(slug);
  meanlogger.log('trash', 'Emptied cart', req.user);

  res.redirect('/shopping-cart');
});

but seems like it wont apply for arrays as it considers only 1st element looking for suggestions

Upvotes: 0

Views: 243

Answers (2)

enxtur
enxtur

Reputation: 2545

There is another way. You should find document first, then pull by ObjectId.

router.post('/empty-cart', isLoggedIn, function (req, res, next) {
    console.log('user' + req.body.user + ',product' + req.body.productId);
    const slug = mongoose.Types.ObjectId(req.body.productId);
    const user = req.body.user;
    User.findOne({ _id: user }, function (err, model) {
        if (err) return res.redirect('/error-page');
        if (!model) return res.redirect('/notfound-page');
        model.productId.pull(slug);
        model.save(function (err) {
          if (err) return res.redirect('/error-page');
          console.log(slug);
          meanlogger.log('trash', 'Emptied cart', req.user);
          res.redirect('/shopping-cart');
        });
    });
});

Upvotes: 0

Aabid
Aabid

Reputation: 941

You cannot use $pull with findOne you should to use update

router.post('/empty-cart', isLoggedIn, function(req, res, next) {
  console.log("user" + req.body.user + ",product" + req.body.productId);
  slug = req.body.productId;
  user = req.body.user;
  User.update({ _id: user }, { $pull: { productId: slug } }, function(err, model) {
    console.log(slug);
    meanlogger.log('trash', 'Emptied cart', req.user);
    res.redirect('/shopping-cart');
  })
});

this is the correct way.

Upvotes: 1

Related Questions