node.js - MongoDB 插入很多,更新很多
问题描述
我在 node.js 中使用 MongoDB。我正在尝试根据不同的条件更新或插入许多文档;但是,MongoDB 更新(使用 upsert)仅适用于单个文档或具有相同条件的多个文档。目前,我有一个包含我要插入的对象的数组(或者如果存在唯一索引则更新),我正在循环遍历数组并调用 updateOnce; 但是,我相信这种方法对于我将拥有的大量对象不是很有效。有什么更好的方法来实现这一目标?
var mongoUtil = require( './database.js' );
var db = mongoUtil.getDb();
//array of objects to insert:
//NOTE: First + Last name is a unique index
var users = [
{firstName:"John", lastName:"Doe", points:300},
{firstName:"Mickey", lastName:"Mouse", points:200}
];
var collection = db.collection( 'points' );
for(var i = 0; i < users.length; i++) {
//If firstName and lastName already exists, update points. Otherwise insert new object
collection.updateOne(
{firstName: users[i].firstName, lastName: users[i].lastName},
{$set: {points: users[i].points}},
{upsert: true},
function(err,docs) {
if(err)
console.log(err);
}
)
}
解决方案
我使用 .bulkWrite() 解决了这个问题:
var mongoUtil = require( './database.js' );
var db = mongoUtil.getDb();
var collection = db.collection( 'points' );
var users = [
{firstName:"John", lastName:"Doe", points:300},
{firstName:"Mickey", lastName:"Mouse", points:200}
];
let userUpdate = users.map(user => ({
updateOne: {
filter: {firstName: user.firstName, lastName: user.lastName},
update: {$set: user},
upsert: true
}
}));
collection.bulkWrite(userUpdate).catch(e => {
console.log(e);
});
推荐阅读
- typescript - 在对象的联合上选择属性时获取对象的联合
- excel - 如何将“条件格式>图标集”中的图标添加到单个单元格?
- azure - SSH 私钥存储在 Azure 中的什么位置?
- r - R使用Purrr Map函数计算KMeans模型的轮廓距离
- java - 我们可以避免将所有字段映射到springdata中的实体类以进行弹性搜索,因为我在json文档中有100多个字段吗?
- node.js - 为什么 make-promises-safe 仅用于“在顶级程序代码中”
- javascript - ReferenceError:虽然我使用的是 puppeteer,但未定义文档
- python - 过滤 pytest 固定装置
- git - 如何在没有快进的情况下取消合并和重新合并?
- python - 无法将 CustomModel 分配给 QQmlListModel