使用 Mongoose 更新对象数组的最佳方法?

Posted

技术标签:

【中文标题】使用 Mongoose 更新对象数组的最佳方法?【英文标题】:Best way to use Mongoose to update an Array of Objects? 【发布时间】:2021-05-29 05:47:09 【问题描述】:

我的 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 或循环是要走的路吗?

任何想法

【问题讨论】:

【参考方案1】:

在这种情况下,我认为 bulkWrite (docs) 比在循环中调用 findOneAndUpdate 是更好的选择,所以你不要发送您对 Mongo 的更新一一。您可以映射您的更新操作并分批发送。示例请参考以下sn-p:

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)
)

【讨论】:

以上是关于使用 Mongoose 更新对象数组的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 在模式中存储 Set 的最佳方法

如何用mongoose更新这个文档中的数组中的对象中的数组里的值?

使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]

使用mongoose在mongoDB中更新数组的数组

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用