2014-09-01 58 views
-1

我试图插入多个文件到我的数据库使用node.js,事情是,我得到一个错误: MongoError:由应用程序关闭的连接 有任何选项可以并行插入多个文档?使用node.js插入多个文件到Mongodb

这里是我的代码:

var MongoClient = require('mongodb').MongoClient; 



var dbName = "tst1"; 
var port = "27017"; 
var requiredCollection = "stocks" 
var host = "localhost"; 

// open the connection the DB server 

MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){ 

    console.log("Connection is opened to : " + "mongodb://" + host + ":" + port + "/" + dbName); 

    if(error) throw error; 

     var ibm = {'_id' : 1, 'value' : 1, 'ticker' : 'IBM'}; 

     db.collection(requiredCollection).insert(ibm, function(error, inserted) { 
      if(error) { 
       console.error(error); 

      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 


     var apple = {'_id' : 2, 'vlue' : 1, 'ticker' : 'AAPL'}; 

     db.collection(requiredCollection).insert(apple, function(error, inserted) { 
      if(error) { 
       console.error(error); 

      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 





     var intel = {'_id' : 3, 'value' : 1, 'ticker' : 'INTC'}; 

     db.collection(requiredCollection).insert(intel, function(error, inserted) { 
      if(error) { 
       console.error(error); 

      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 


     var f5 = {'_id' : 4, 'value' : 1, 'ticker' : 'FFIV'}; 

     db.collection(requiredCollection).insert(f5, function(error, inserted) { 
      if(error) { 
       console.error(error); 

      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 




     var arris = {'_id' : 5, 'value' : 1, 'ticker' : 'ARRS'}; 

     db.collection(requiredCollection).insert(arris, function(error, inserted) { 
      if(error) { 
       console.error(error); 

      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 

     db.close(); 





}); // Connection to the DB 
+1

您需要在 “异步” 代码阅读起来。在所有其他操作完成之前调用'.close()'。操作不一定按顺序“完成”。看一下[“async”](https://github.com/caolan/async)作为节点库,以了解如何按照您的意愿在“系列”中清晰地执行此操作。一般来说,除非你真的做完了,否则你几乎从不**真的想明确关闭你的数据库连接。 – 2014-09-01 11:17:25

+0

你能给我一些代码示例吗? – user3502786 2014-09-01 11:20:50

回答

0

"async"库在这里帮助你,你需要了解的“回调”,在异步代码和主要的事情这有助于你是“代码蔓延”由于不再需要在代码中“缩进”每个“下一个”呼叫。

事实上,您可以在"parallel"而不是"series"中进行合理的操作。我们只需要等待每个完成,这是“回调”的目的。据“回调”调用“下一步行动”的时候,操作完成:

var MongoClient = require('mongodb').MongoClient, 
    async = require('async'); 

var dbName = "tst1"; 
var port = "27017"; 
var requiredCollection = "stocks" 
var host = "localhost"; 

// open the connection the DB server 

MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){ 

    console.log("Connection is opened to : " + "mongodb://" + host + ":" + port + "/" + dbName); 

    if(error) throw error; 

    async.parallel(
     [   
     function(callback) {  
      var ibm = {'_id' : 1, 'value' : 1, 'ticker' : 'IBM'}; 

      db.collection(requiredCollection).insert(ibm, function(error, inserted) { 
      if(error) { 
       console.error(error); 
       callback(error); 
      } else { 
       console.log("Successfully inserted: " , inserted); 
       callback(); 
      } 
      }); // end of insert 
     }, 
     function(callback) { 
     var apple = {'_id' : 2, 'vlue' : 1, 'ticker' : 'AAPL'}; 

     db.collection(requiredCollection).insert(apple, function(error, inserted) { 
      if(error) { 
      console.error(error); 
      callback(error); 
      } else { 
      console.log("Successfully inserted: " , inserted); 
      callback(); 
      } 
     }); // end of insert 
     }, 
     function(callback) {  
     var intel = {'_id' : 3, 'value' : 1, 'ticker' : 'INTC'}; 

     db.collection(requiredCollection).insert(intel, function(error, inserted) { 
      if(error) { 
      console.error(error) 
      callback(error); 
      } else { 
      console.log("Successfully inserted: " , inserted); 
      callback(); 
      } 
     }); // end of insert 
     }, 
     function(callback) {  
     var f5 = {'_id' : 4, 'value' : 1, 'ticker' : 'FFIV'}; 

     db.collection(requiredCollection).insert(f5, function(error, inserted) { 
      if(error) { 
      console.error(error); 
      callback(error); 
      } else { 
      console.log("Successfully inserted: " , inserted); 
      callback(); 
      } 
     }); // end of insert 
     }, 
     function(callback) { 
     var arris = {'_id' : 5, 'value' : 1, 'ticker' : 'ARRS'}; 

     db.collection(requiredCollection).insert(arris, function(error, inserted) { 
      if(error) { 
      console.error(error) 
      callback(error); 
      } else { 
      console.log("Successfully inserted: " , inserted); 
      } 
     }); // end of insert 
     }, 
    ], 
    function(err) { 
     // called when everything is done 
     db.close(); 
    }  
); 
}); // Connection to the DB 

每个操作现在等待它的“回调”从它自己的“回调”上下文调用以及有作为“流量控制”等到全部操作完成之后,最后在所有操作结束时“关闭”连接。

但正如前面所说的,除非这是一个“一次性”的剧本,你基本上从未数据库连接呼叫.close(),你永远只能打开一次

0

你可以使用蒙戈批量插入https://docs.mongodb.com/manual/reference/method/Bulk.insert/

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.insert({ item: "abc123", defaultQty: 100, status: "A", points: 100 }); 
bulk.insert({ item: "ijk123", defaultQty: 200, status: "A", points: 200 }); 
bulk.insert({ item: "mop123", defaultQty: 0, status: "P", points: 0 }); 
bulk.execute(); 
1

在MongoDB中3.2及以上,您可以使用db.collection.insertMany()保存多个文件合并为一个集合版本。 (see documentation

您的代码可以简化为:

var MongoClient = require('mongodb').MongoClient; 

var dbName = "tst1"; 
var port = "27017"; 
var requiredCollection = "stocks" 
var host = "localhost"; 

// open the connection the DB server 

MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){ 

    console.log("Connection is opened to : " + "mongodb://" + host + ":" + port + "/" + dbName); 

    if(error) throw error; 

     var docs = [{ _id: 1, value: 1, ticker: 'IBM' }, 
        { _id: 2, value: 1, ticker: 'AAPL' }, 
        { _id: 3, value: 1, ticker: 'INTC' }, 
        { _id: 4, value: 1, ticker: 'FFIV' }, 
        { _id: 5, value: 1, ticker: 'ARRS' }]; 

     db.collection(requiredCollection).insertMany(docs, function(error, inserted) { 
      if(error) { 
       console.error(error); 
      } 
      else { 
       console.log("Successfully inserted: " , inserted); 
      } 

     }); // end of insert 

     db.close(); 

}); // Connection to the DB