MongoDB - UpdateMany 或 Bulk.find.upsert 用于更新对象数组

MongoDB - UpdateMany or Bulk.find.upsert for Upserting an Array of Objects

我有一个应用程序通过 Mongo Realm HTTP 第三方服务将数据从 Google Sheet 导出到 Mongo;我不确定 Realm 方面在这里是否特别相关,但我可能是错的。

Google Sheets 的导出将对象数组发送到 Mongo(下面的示例),我想更新 card_ids 匹配的文档,否则我想创建新文档。最初我认为这样做的方法是通过 updatemany() 但使用 $set 的示例似乎具有静态值,例如:

db.restaurant.updateMany(
      { violations: { $gt: 4 } },
      { $set: { "Review" : true } }
   );

我会知道 属性 的名称,但不知道值,当然我传递的数组中每个 objects/documents 的值都会不同。

查看关于 SO () 的类似问题,我可以看到建议使用 Bulk API 并且 Bulk.find(<query>).upsert().update(<update>); 似乎是我想要的,但我又不是确定如何将 $set 与动态值一起使用。

对于实现此目标的最佳方法的任何建议,我将不胜感激。

示例数组从 Google Sheets 发送到 Mongo:

[
 { user: 'asdascom',
    userName: 'asdascom',
    year: 2019,
    player: 'terin test',
    manufacturer: 'Panini',
    brand: 'Natiosures',
    series: 'Rookigraphs',
    grader: 'PSA',
    graded_id: 0,
    career_stage: 'Rookard',
    team: 'Washington Football Team',
    card_number: 1,
    print_run: 99,
    number: 98,
    image_path: 'kjhkj',
    forTrade: 'No',
    status: 'Own',
    purchase_date: Tue Feb 02 2021 00:00:00 GMT+0000 (Greenwich Mean Time),
    card_id: 'cardid-1612814958860' },
  { user: 'jisdsdom',
    userName: 'jisdsdom',
    year: 2014,
    player: 'Terry Test2',
    manufacturer: 'Panini',
    brand: 'Flass',
    series: 'All Pro Ink',
    grader: 'PSA',
    graded_id: 23397853,
    career_stage: 'Roord',
    team: 'Washington Football Team',
    card_number: 1,
    print_run: 3,
    number: 2,
    image_path: 'kbkb',
    forTrade: 'No',
    status: 'Own',
    purchase_date: Fri Feb 05 2021 00:00:00 GMT+0000 (Greenwich Mean Time),
    card_id: 'cardid-1612815099960' } 
]

好的,我想我已经找到了答案,请看下面 - 希望这对某人有用,下面我展示了完整的 Realm 功能代码:

const collection = context.services.get("mongodb-atlas").db("yourdb").collection("your collection");
const query = EJSON.parse(payload.body.text())
//console.log("payload.query "+ JSON.stringify(query));

return collection.bulkWrite(
  query.map(c => { 
    return { updateOne:
      {
        filter: { card_id: c.card_id },
        update: {$set: c},
        upsert : true
      }
    }
  }
  ),
  { ordered : false }
);
}