如何使用 React 从 MongoDB 数组中正确删除用户?

Posted

技术标签:

【中文标题】如何使用 React 从 MongoDB 数组中正确删除用户?【英文标题】:How can I properly delete a user from a MongoDB array with React? 【发布时间】:2021-04-01 18:38:38 【问题描述】:

所以我觉得我已经接近了这个,只需要一个小修复来让它正确。我有一个包含 2 个用户和书籍集合的应用程序,我已经设置了它,如果 2 个用户拥有同一本书,他们将被添加到用户数组中,该数组也是书籍集合中的参考。

也就是说,我希望用户能够通过从该数组中删除用户来“删除一本书”,但我的路由无法完全正确。我尝试将 props.match.params.id 添加到前端路由,以及在过滤器之前使用 map,但效果不佳,所以现在我有一个 book ID。

有接受者吗?我发现了一些类似的问题,但我认为这有点复杂。我感谢任何 cmets 或想法!

这是 Node/Express 中的删除路由:

router.delete(
  '/:id',
  // passport.authenticate('jwt',  session: false ),
  async (req, res) => 
    try 
      // if (!mongoose.Types.ObjectId.isValid( _id: req.params.id )) return false
      const filter =  _id: req.params.id 
      //$and: [
      /* title:  $eq: req.body.title  ,
       author:  $eq: req.body.author  */
      //]
      const update = 
        $pull:  user:  $in: [`$req.user.id`]  
      
      const book = await Book.findOneAndUpdate(filter,
        update,  new: true, runValidators: true , (err, book) => 
          err ? res.json( success: false, err ) : res.status(200).json(book)
        
      )
     catch (err) 
      console.error(err.message)
      res.status(500).send('Server Error')
    
  
)

这是 React 中的前端路由(2 sn-ps):

const removeUser = id => 
    axios
      .delete(`http://localhost:3001/api/books/5f7d619a58b64d50fdf494f5?&user=$id`, id)
      .then(res => 
        const books = state.books.filter(book => book._id !== id)
        setState( books )
      )
      .catch(err => console.log(err))
  

  const countBooks = filter => 
    const  books  = state
    return books.filter(book => filter ? book[filter] : book).length
  

  return <>
    <Count total=countBooks() />
    <Form onNewBook=addBook />
    <div className="row" style=divStyle>
      <div className="col s5">Title</div>
      <div className="col s4">Author</div>
      <div className="col s3" style= marginBottom: '5px' >
        <Link to="/compare">Read By?</Link>
      </div>
    </div>
    state.books.map(book => <List book=book key=book._id onRemoveUser=removeUser />)
  </>

这是来自 List 组件,其中包含一个模态:

<button 
className="btn waves-effect waves-light" 
onClick=() => onRemoveUser(book.user.map((user, i) => <p key=i style= margin: '0' >user._id</p>))
              autoFocus
              style= margin: '5px' 
            >
              Yes
          </button>

【问题讨论】:

尝试使用 const filter = _id: mongoose.Types.ObjectId(req.params.id) 将字符串 id 转换为对象类型,如果它的对象 id 在集合 user: $in: [$mongoose.Types.ObjectId(req.user.id)@987654327 中,也可以在更新部分内@ 嘿,非常感谢 - 成功了!现在我唯一的问题是:将图书 ID 放在我的前端路由中的最佳方式是什么? 我不确定,但你可以做到 .delete(localhost:3001/api/booksbookId/$userid) 和服务器端 router.delete('/:bookId/:userId', 谢谢 - 我的设置不太适合,但我会继续尝试。你让我走到了一半。 我知道,这就是我发布它的原因,以防其他人有同样的问题。 :) 【参考方案1】:

您是否尝试过使用 MongoDB 集合中的“Book.findOneAndDelete”一本书?您可以将您的 bookid 作为 id 传递给此例程。

【讨论】:

谢谢 - 我调查了一下,但我觉得这需要 findOneAndUpdate 因为我不想删除这本书,只是删除数组中的用户。不过我实际上并没有在实践中尝试过。 试过 findOneAndDelete 并没有什么不同。

以上是关于如何使用 React 从 MongoDB 数组中正确删除用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-router-dom 中正确定义后备路由

如何在 Swift 中正确实现方向数组缩减挑战中的堆栈

如何在核心数据中正确保存可转换对象?

如何使用 GraphQL 在 MERN 应用程序的 MongoDB 模式中插入数组字段?

从Blob中正确保存C#中的.mp4文件[关闭]

如何使用 LINQ 的 AsQueryable() 从 MongoDB 的内部数组中获取数据?