让我们说我有一系列电影类型如下:
[
{ id: 28, name: 'Action' },
{ id: 12, name: 'Adventure' },
{ id: 16, name: 'Animation' },
{ id: 35, name: 'Comedy' },
{ id: 80, name: 'Crime' },
{ id: 99, name: 'Documentary' },
{ id: 18, name: 'Drama' },
{ id: 10751, name: 'Family' },
{ id: 14, name: 'Fantasy' },
{ id: 10769, name: 'Foreign' },
{ id: 36, name: 'History' },
{ id: 27, name: 'Horror' },
{ id: 10402, name: 'Music' },
{ id: 9648, name: 'Mystery' },
{ id: 10749, name: 'Romance' },
{ id: 878, name: 'Science Fiction' },
{ id: 10770, name: 'TV Movie' },
{ id: 53, name: 'Thriller' },
{ id: 10752, name: 'War' },
{ id: 37, name: 'Western' }
]
我和MongoDB(v3.2)实例有连接:db
,我使用标准的mongodb Node.js驱动程序(const mongodb = require('mongodb').MongoClient
)。
我希望能够做的是对集合进行一次批量upsert操作,比如genres
,其中_id
字段映射到我们类型对象的id
字段。< / p>
现在,我知道我可以遍历数组中的每个项目,并做一个简单的upsert:
for (let i = 0; i < genres.length; i++) {
await db.collection('genres').update(
{ _id: genres[i].id },
genres[i],
{ upsert: true }
);
}
但这感觉浪费错误。
是否有更简单的方法来完成应该是一项相对简单的任务?
由于
答案 0 :(得分:6)
使用 bulkWrite
API执行更新:
var bulkUpdateOps = genres.map(function(doc) {
return {
"updateOne": {
"filter": { "_id": doc.id },
"update": { "$set": { "name": doc.name } },
"upsert": true
}
};
});
db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
}
如果你正在处理更大的数组,即&gt; 1000然后考虑将批量写入服务器的500个批次发送到服务器,因为您不是每次向服务器发送每个请求,而是每500个请求中只有一次:
var bulkUpdateOps = [],
counter = 0;
genres.forEach(function(doc) {
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc.id },
"update": { "$set": { "name": doc.name } },
"upsert": true
}
});
counter++;
if (counter % 500 == 0) {
db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
});
bulkUpdateOps = [];
}
})
if (counter % 500 != 0) {
db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
}
}
答案 1 :(得分:2)
我会尝试:
db.collection('genres').update(genres, {upsert: true, multi: true});
注意:未经测试的代码......
更新:将id
字段重新映射为_id
:
var _genres = genres.map(function(genre) {
return { _id: genre.id, name: genre.name };
});
db.collection('genres').update(_genres, {upsert: true, multi: true});