每次迭代后在FOR循环中插入数据

时间:2019-07-30 04:46:43

标签: node.js mongodb

我正在尝试通过node.js将数据插入MongoDB数据库中

addToDatabase调用函数for loop。无论进行多次迭代,该脚本都不会将数据插入数据库,直到完成所有迭代(在for循环结束时为止)。

我只希望脚本在每次迭代后完成数据库插入操作。

先谢谢了。

这是我的代码:

const mongoClient = require('mongodb').MongoClient;

function addToDatabase(data){
    MongoClient.connect(config.database.url, {useNewUrlParser: true}, function(err, db) {
        if (err) throw err;
        var dbo = db.db(config.database.dbName);
        dbo.collection(config.database.collectionAd).insertOne(data, function(err, res) {
            if (err) throw err;
            console.log('Ad insered : ' + data._id);
            db.close();
        });
    });

}

function getAdDetails(ads){
    for (var itemKey in ads.items) {
        //Statements ...
        addToDatabase(obj);
    }
}

getAdDetails(obj)

1 个答案:

答案 0 :(得分:1)

此代码中有些东西不是最佳的。

  1. 您正在循环中的每次迭代上与数据库连接和断开连接,这对数据库造成了很大的负担,并且性能不佳。您应该缓存/重用连接,并在开始时连接一次,在完成所有工作后结束连接。
  2. 您可以使用insertMany来最大程度地减少数据库负载并提高性能https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/
  3. ,而无需循环和使用insertOne。
  4. MongoDB客户端已经返回了Promise,而不是使用回调,因此您可以使用它在关闭连接之前等待所有操作完成
  5. (可能是主要问题),您正在for循环中关闭其中一个查询的回调内部的连接,因为它是异步的,您可能在所有操作完成之前关闭了连接中间操作,并像随机模式,例如“连接连接连接,断开连接连接,断开连接等。”而不是您期望的“连接断开连接连接断开”。要解决此问题,您可以确保addToDatabase返回一个成功完成插入的诺言,并使用Promise.all等待所有插入完成

改为尝试类似的方法

const mongoClient = require('mongodb').MongoClient

(async function () {
  // connect
  try {
    await mongoClient.connect(config.database.url, { useNewUrlParser: true })
    const db = mongoClient.db(config.database.dbName)

    // do stuff
    const results = await db.collection(config.database.collectionAd).insertMany(ads.items)
    console.log('Ads insered : ', results)
  } catch (err) {
    console.log(err)
  }
  // close connection at the end
  mongoClient.close()
})()