首页 > 解决方案 > 使用 Mongoose 更新对象数组的最佳方法?

问题描述

我的 req.body 是这样的,它来自我的前端,所以它是一个数组中的几个对象,id 喜欢根据匹配但页面已更改的记录进行更新。

[
[0]   {
[0]     _id: '60393a58c772c12724aa636e',
[0]     title: 'newTitle2',
[0]     page: '8',
[0]     book: '010',
[0]     __v: 0
[0]   },
[0]   {
[0]     _id: '60394e08f6e0ad0bb077e0bc',
[0]     title: 'newTitle3',
[0]     page: '123',
[0]     book: '099',
[0]     __v: 0
[0]   }
[0] ]

我的路线是这样的

router.post("/dataSend", async(req, res) => {

let { title, page, book} = req.body;

console.log(req.body)
const filter = { title };
const update = { page};

let doc = await Data.findOneAndUpdate({title:req.body[0].title},{page: req.body[0].page});

res.send(doc)
})

因此,如果我使用 mongoose 指定我想更新 [0] 第一个数组,这将起作用,但我想更新所有内容,我不确定 .map 或 forEach 或循环是要走的路吗?

有任何想法吗

标签: javascriptarraysreactjsmongodbmongoose

解决方案


在这种情况下,我认为(文档)findOneAndUpdate不是循环调用,而是更好的选择,因此您不会将更新一一发送到 Mongo。您可以映射您的更新操作并分批发送。请参阅以下代码段以获取示例:bulkWrite

router.post("/dataSend", async(req, res) => {
  const records = req.body

  const updateOps = records.map(record => {
    const updateOp = {
      'updateOne': {
        'filter': {
          'title': record.title,
        },
        'update': {
          'page': record.page
        },
      }
    }
    
    return updateOp
  })


  const result = await Data.bulkWrite(updateOps)

  res.send(result)
})


推荐阅读