我有一个很大的数据集,我需要从我的node.js应用程序上传到mongo数据库,它通过for
循环运行以获取所有结果。最初,我在每个循环中都连接到MongoDB,但这导致它崩溃。
由于我将其移出了循环,db.close()
导致了问题,如果我将其留在循环中,则会关闭连接(由于未在循环中重新建立连接,导致应用程序崩溃):
MongoError: server instance pool was destroyed
但是,如果我将其移出循环,它将被卡住而不离开循环并继续执行其他操作。
有人知道如何才能在for
循环之外有效地关闭数据库连接,而仅在完成循环之后?
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydatabase");
//run sql query to get data
for(result in sqldata) {
myobj = {Number: sqldata[result].Num} //<--- this for loop produces 16000 entries
dbo.collection("customers").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("1 document inserted");
db.close(); //<--- this is the issue
});
}
});
答案 0 :(得分:1)
您可以await
进行插入操作。
MongoClient.connect(url, async (err, db) => {
if (err) throw err;
var dbo = db.db("mydatabase");
let results = [];
//run sql query to get data
for(result in sqldata) {
myobj = {Number: sqldata[result].Num} //<--- this for loop produces 16000 entries
results.push(
new Promise((resolve) => {
dbo.collection("customers").insertOne(myobj, (err, res) => {
console.log(err ? 'Document not inserted' : 'Document inserted');
resolve();
})
})
);
}
await Promise.all(results);
db.close();
});