与Java相比,使用node.js在mongo中插入和更新速度较慢
我正在编写独立脚本,以便在一个集合中插入大约5000条记录。我正在使用相同的5000条记录更新另一个集合。 我的问题是,当我使用java和mongo编写这篇文章时,一个接一个地运行这两个操作几乎需要1.1秒 但当我使用Node.js编写它时,插入记录大约需要1.1秒,更新操作大约需要10秒 这两次测试都是在具有相同索引的相同集合上进行的。 你能帮我解释一下为什么Node.js花费的时间是java的近10倍吗 更新记录的Node.js版本与Java相比,使用node.js在mongo中插入和更新速度较慢,java,node.js,mongodb,Java,Node.js,Mongodb,我正在编写独立脚本,以便在一个集合中插入大约5000条记录。我正在使用相同的5000条记录更新另一个集合。 我的问题是,当我使用java和mongo编写这篇文章时,一个接一个地运行这两个操作几乎需要1.1秒 但当我使用Node.js编写它时,插入记录大约需要1.1秒,更新操作大约需要10秒 这两次测试都是在具有相同索引的相同集合上进行的。 你能帮我解释一下为什么Node.js花费的时间是java的近10倍吗 更新记录的Node.js版本 var db = new Db(articleDBN
var db = new Db(articleDBName , new Server(mongoIP, mongoPort, {safe: false, strict: false}, {auto_reconnect: true}),{w:0});
db.open(function(error,db){
var d = new Date();
var tc = d.getTime();
if(error){
console.log(error);
closeDB(db,dbName);
}else{
for(var i in logs){
var record = logs[i];
try{
var articleId = utils.getString(record["articleId"]);
var query = {"articleId":articleId} ;
var count = record["count"];
var author = utils.getString(record["author"]);
var articleCount = db.collection("ArticleCountTempNode");
var updateObj = { $set:{"author" : author,
"channel" : channel
},$inc:{"count":count}};
articleCount.update(query,updateObj,{upsert: true, multi:false},function(error, result) {
if(error){
console.log("Error Log " + error);
}else{
}
});
}catch(error){
console.log("Error Log " + error);
}
}
closeDB(db,articleDBName);
var dt = new Date();
console.log("time Taken Article Count----"+(dt.getTime() - tc));
}
});
DB articleDBHistory = mongo.getDB(articleDBName);
DBCollection articleCollHistory = articleDBHistory.getCollection(Config.ARTICLE_COUNT_COLLECTION);
try {
articleDBHistory.requestStart();
DBObject query = null;
BasicDBObject bDbObj = null;
String articleId = null;
long t = System.currentTimeMillis();
for (DBObject dbo : dbl)
{
articleId = dbo.get("articleId").toString();
if (articleId != null && articleId != "") {
query = new BasicDBObject("articleId",
dbo.get("articleId")));
bDbObj = new BasicDBObject("$set",
new BasicDBObject("author", dbo.get("author")))
.append("$inc", new BasicDBObject("count",
((Double)Double.parseDouble(dbo.get("count").toString())).longValue()));
articleCollHistory.update(query, bDbObj, true, false);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
articleDBHistory.requestDone();
}
更新记录的Java版本
var db = new Db(articleDBName , new Server(mongoIP, mongoPort, {safe: false, strict: false}, {auto_reconnect: true}),{w:0});
db.open(function(error,db){
var d = new Date();
var tc = d.getTime();
if(error){
console.log(error);
closeDB(db,dbName);
}else{
for(var i in logs){
var record = logs[i];
try{
var articleId = utils.getString(record["articleId"]);
var query = {"articleId":articleId} ;
var count = record["count"];
var author = utils.getString(record["author"]);
var articleCount = db.collection("ArticleCountTempNode");
var updateObj = { $set:{"author" : author,
"channel" : channel
},$inc:{"count":count}};
articleCount.update(query,updateObj,{upsert: true, multi:false},function(error, result) {
if(error){
console.log("Error Log " + error);
}else{
}
});
}catch(error){
console.log("Error Log " + error);
}
}
closeDB(db,articleDBName);
var dt = new Date();
console.log("time Taken Article Count----"+(dt.getTime() - tc));
}
});
DB articleDBHistory = mongo.getDB(articleDBName);
DBCollection articleCollHistory = articleDBHistory.getCollection(Config.ARTICLE_COUNT_COLLECTION);
try {
articleDBHistory.requestStart();
DBObject query = null;
BasicDBObject bDbObj = null;
String articleId = null;
long t = System.currentTimeMillis();
for (DBObject dbo : dbl)
{
articleId = dbo.get("articleId").toString();
if (articleId != null && articleId != "") {
query = new BasicDBObject("articleId",
dbo.get("articleId")));
bDbObj = new BasicDBObject("$set",
new BasicDBObject("author", dbo.get("author")))
.append("$inc", new BasicDBObject("count",
((Double)Double.parseDouble(dbo.get("count").toString())).longValue()));
articleCollHistory.update(query, bDbObj, true, false);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
articleDBHistory.requestDone();
}
请向我们展示这两个版本的代码。在Node.js示例中,您似乎有一个嵌套的for循环,但在Java示例中没有。你确定这些样本是等效的吗?#Hector Correa感谢你指出这是不必要的循环。我删除了它,但node.js所用的时间与java相比几乎是5秒,java只需1秒钟。我不明白node.js版本是如何工作的,因为您似乎在等待所有
更新
调用完成之前关闭了数据库连接。您还应该将您的db.collection
调用移到循环外部。Hi@johnyhk我正在循环后关闭db连接。