mongoose 如何在JS中通过数组来upsert多个对象?

mrwjdhj3  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(100)

我有一个数组,其中每个对象,我需要找到,如果一些关键存在,那么它应该更新或插入。我已经这样做了,从循环,但问题是我有大约20 L的数据,需要通过这个每天早上使用cron调度运行。
我的问题是:我可以使用一些其他的方式,比如我把这个数组传递给一个方法,以获得更好的性能吗?
我的方法:

const arr = [{id: 1, pre: 10, post: 15 , name: 'egg'},{id: 2, pre: 10, post: 15 , name: 'egg 2'},{id: 3, pre: 10, post: 15 , name: 'egg 3'},{id: 4, pre: 10, post: 15 , name: 'egg 4'}]

for(x = 0; x < arr.length ; x++) {
   await processed_.findByIdAndUpdate({id: arr[x].id}, { $set: arr[x] }, {upsert: true, new: true})
}

字符串
谢谢你的建议。

nr7wwzry

nr7wwzry1#

您需要使用 bulkWrite 来提高代码的性能。bulkWrite允许您在一个请求中发送多个更新或插入操作,从而减少发送到数据库的请求数量。示例代码如下(未经测试的代码,但您可以理解):

const arr = [
  {id: 1, pre: 10, post: 15, name: 'egg'},
  {id: 2, pre: 10, post: 15, name: 'egg 2'},
  {id: 3, pre: 10, post: 15, name: 'egg 3'},
  {id: 4, pre: 10, post: 15, name: 'egg 4'},
// ... others
];

const bulkOps = arr.map(doc => ({
  updateOne: {
    filter: {id: doc.id},
    update: {$set: doc},
    upsert: true
  }
}));

await processed_.bulkWrite(bulkOps);

字符串

注意(从你可能想看看的地方):

每个组中的操作数不能超过数据库的maxWriteBatchSize值。maxWriteBatchSize的默认值为100,000。此值显示在hello.maxWriteBatchSize字段中。

相关问题