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_id
s 匹配的文档,否则我想创建新文档。最初我认为这样做的方法是通过 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 }
);
}
我有一个应用程序通过 Mongo Realm HTTP 第三方服务将数据从 Google Sheet 导出到 Mongo;我不确定 Realm 方面在这里是否特别相关,但我可能是错的。
Google Sheets 的导出将对象数组发送到 Mongo(下面的示例),我想更新 card_id
s 匹配的文档,否则我想创建新文档。最初我认为这样做的方法是通过 updatemany() 但使用 $set
的示例似乎具有静态值,例如:
db.restaurant.updateMany(
{ violations: { $gt: 4 } },
{ $set: { "Review" : true } }
);
我会知道 属性 的名称,但不知道值,当然我传递的数组中每个 objects/documents 的值都会不同。
查看关于 SO (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 }
);
}