我正在解析一个CSV文件,对于每一行我想检查数据库中是否存在相应的条目,如果是,我想更新它,如果它不想输入新条目。
非常慢 - 每秒只有大约30个条目。
我做错了什么?
使用node,mongodb,monk
function loadShopsCSV(ShopsName) {
var filename = 'test.csv'
csv
.fromPath(filename)
.on("data", function(data) {
var entry = {
PeriodEST: Date.parse(data[0]),
TextDate: textDateM,
ShopId: parseInt(data[1]),
ShopName: data[2],
State: data[3],
AreaUS: parseInt(data[4]),
AreaUSX: AreaUSArray[stateArray.indexOf(data[3])],
ProductClass: data[5],
Type: data[6],
SumNetVolume: parseInt(data[7]),
Weekday: weekdayNum,
WeightedAvgPrice: parseFloat(data[8]),
}
db.get(ShopsDBname).update(
{"PeriodEST" : entry.PeriodEST,
"ShopName": entry.ShopName,
"State" : entry.State,
"AreaUS" : entry.AreaUS,
"ProductClass" : entry.ProductClass,
"Type" : entry.Type},
{$set : entry},
function(err, result) {
}
);
}
}
})
.on("end", function() {
console.log('finished loading: '+ShopsName)
});
}, function(err) {
console.error(err);
});
}
答案 0 :(得分:1)
首先我建议本地化问题:
.on("data", function(data)
替换.on("data", function() {return;})
并确认csv解析的速度。db.setProfilingLevel(1)
,如果有任何查询慢于100毫秒,请检查慢速日志。如果上面没有问题 - 瓶颈在你用来准备和发送查询的一个nodejs库中。
假设问题在于mongodb查询速度慢,您可以使用explain进行更新查询以获取详细信息。可能是它不使用任何索引并为每次更新运行表扫描。
最后,建议使用专为您的用例而设计的bulk操作。
答案 1 :(得分:0)
您是否尝试过更新而没有写入问题?当MongoDB阻塞,直到整个更新成功并且DB发回该确认?你是集群还是什么? (如果是的话,可能想写入主节点)
在你的{$ set:entry}之后{writeConcern:{w:0}}