与Java相比,使用node.js在mongo中插入和更新速度较慢

与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

我正在编写独立脚本,以便在一个集合中插入大约5000条记录。我正在使用相同的5000条记录更新另一个集合。 我的问题是,当我使用java和mongo编写这篇文章时,一个接一个地运行这两个操作几乎需要1.1秒 但当我使用Node.js编写它时,插入记录大约需要1.1秒,更新操作大约需要10秒

这两次测试都是在具有相同索引的相同集合上进行的。 你能帮我解释一下为什么Node.js花费的时间是java的近10倍吗

更新记录的Node.js版本

   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连接。