通过更新方法从数组中删除元素

时间:2019-08-05 10:41:14

标签: javascript mongoose

我正在尝试从我创建的猫鼬模式之一的数组中删除一个元素。但是pull方法对我来说似乎不太好

我设法添加一个元素,并且我试图使其基本相同,但相反。但是pull方法似乎不适用于我。

这是我的模式

export PATH=$PATH:/usr/local/go/bin

这就是我向数组添加元素的方式

userName: {type: String, required: true, unique: true},
    password: {type: String, required: true},
    favorite: [{type: Schema.Types.ObjectId, ref:'programs'}]

在这里,我尝试以类似的方式删除一个元素,但是没有用,在邮递员中它表明它不能放置

router.put('/favorite/:id', (req, res) => {
    User.findOne({ _id: req.params.id }, (err, user) => {
        if(err) return console.error(err);
        user.favorite.push(req.body.favorite);
        user.save((err, user) => {
            if(err) return console.error(err);
            console.log(user);
        });
        res.json(user);
    })
});

基本上,我只需要能够按其ID删除该元素。我觉得应该在某处提到id,但是我不确定在哪里或如何使用。感谢所有提示

1 个答案:

答案 0 :(得分:2)

我强烈建议使用由callbacks插入的async awaitmongoose支持Promises

您还可以使用mongoose queries而不是JavaScript来更新字段,这将减少对数据库的查询量。

此外,当发生错误时,请不要忘记向用户发送响应以告知发生了问题。

您尝试在MongoDB $pull中使用JavaScript运算符,而不是在查询中使用它,但是您不能在MongoDB operators中使用JavaScript

您还可以通过req.params的{​​{3}}属性来使其更具可读性

请注意,该ID必须是用户文档ID,收藏夹必须是收藏夹文档ID

现在您可以使用destructure

添加到收藏夹
// to use the await keyword we have to set the callback to an async function
router.put('/favorite/:id', async (req, res) => {
  // destruct id from the req.params object and favorite from req.body
  const { id } = req.params;
  const { favorite } = req.body;
  try {
    const updatedUser = await User.findByIdAndUpdate(id,
      { $push: { favorites: favorite } },
      // new: true means return the updated document
      { new: true },
    );
    res.send(updatedUser);
  } catch (e) {
    console.error(e);
    res.status(500).send('Something went wrong');
  }
});

并使用$push

从收藏夹中删除
router.put('/favorite/delete/:id', async (req, res) => {
  const { id } = req.params;
  const { favorite } = req.body;
  try {
    const updatedUser = await User.findByIdAndUpdate(id,
      { $pull: { favorites: favorite } },
      { new: true },
    );
    res.send(updatedUser);
  } catch (e) {
    console.error(e);
    res.status(500).send('Something went wrong');
  }
});