【问题标题】:Delete from mongoDB by id按 id 从 mongoDB 中删除
【发布时间】:2020-11-07 03:58:14
【问题描述】:

我想使用我传递给它的id 而不是object ID 从我的数据库中删除一个项目。我该怎么做?
我在deleteOne 上做了一些阅读,但我不太确定如何开始使用它。
每部电影都有一个删除电影的按钮,所以我需要将每部电影的id 传递给删除函数。此处是 MERN 堆栈的新手。

{
    "_id": "5fa55741aae528142e96c9e6",
    "id": 531219,
    "user": "5fa406cf937ce199eeb176a1",
    "title": "Roald Dahl's The Witches",
    "overview": "large string ... ",
    "poster_path": "/betExZlgK0l7CZ9CsCBVcwO1OjL.jpg",
    "vote_average": "7.1",
    "__v": 0
},

到目前为止我的代码

router.delete('/:id/delete', auth, async  (req, res)=>{
    const movie = await Movie.findByIdAndRemove(req.body.id)

    if(!movie){
        res.send('Movie not found')
    } else{
        movie.remove()
        res.send('movie deleted')
    }

})
case REMOVE_MOVIE:
    return{...state, wishlist:state.wishlist.filter(movie => movie.id !== payload)}
export const removeMovie = (id) => async dispatch => {
  try {
    await axios.delete(`/wishlist/${id}/delete`)
    dispatch({
      type: REMOVE_MOVIE,
      payload:id
    })
  } catch (error) {
    console.log('unable to delete movie')
    console.error(error)
  }
}

【问题讨论】:

    标签: node.js reactjs mongodb redux


    【解决方案1】:

    您的问题是 findByIdAndRemove() 查找 _id 并且您想使用其他值来执行查询。所以你可以使用Mongoose中的findOneAndDelete()函数。

    还有更多功能可以作为deleteOnefindAndDelete 完成这项工作。但是如果你想通过 id 删除我推荐使用findOneAndDelete 因为返回被删除的文档。

    然后你必须通过id 来查询这样的:

    var deleted = await model.findAndDelete({id: "myID"})
    

    请注意,id_id 不同。

    仅此而已……

    从文档中了解函数的工作原理:

    findOneAndDelete()

    根据过滤器和排序标准删除单个文档,返回已删除的文档。

    deleteOne

    从集合中删除单个文档。

    另外,如果您使用mongoose 并且想要通过_id 删除,您可以使用findByIdAndDelete() 函数而不是findByIdAndRemove()

    根据documentation

    此函数与 Model.findOneAndRemove() 略有不同,因为 findOneAndRemove() 变成了 MongoDB findAndModify() 命令,而不是 findOneAndDelete() 命令。对于大多数猫鼬用例,这种区别纯粹是迂腐的。除非您有充分的理由不这样做,否则您应该使用 findOneAndDelete()。

    【讨论】:

    • 好吧,我现在遇到的问题是我能够从状态中清除电影,但不能从数据库中清除。当应用重新加载时,电影又回来了。
    • 在我的回答中,我使用“myID”作为字符串。不要使用双引号和数字,应该与原始架构一起使用。
    【解决方案2】:

    我可以使用上面的建议解决这个问题,但是我需要捕获被点击的电影的值并将其分配给传递给 findOneAndDelete 的 id 值。我通过传入 req.params.id 来做到这一点。所以它是 findOneAndDelete({id: req.params.id})。现在一切都按预期工作。谢谢!

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多