nodejs

时间:2017-09-25 09:15:10

标签: node.js mongodb

我正在使用mongodb和nodejs。我的mongodb实用程序具有以下代码

在mongodbUtil.js中:

var MongoClient = require('mongodb').MongoClient

var state = {
    db: null,
}

exports.connect = function(url, done) {
    if (state.db) return done()

    MongoClient.connect(url, function(err, db) {
        if (err) return done(err)
        state.db = db
        done()
    })
}

exports.get = function() {
    return state.db
}


/* 1 : when is close called */
exports.close = function(done) {
    if (state.db) {
        state.db.close(function(err, result) {
            state.db = null
            state.mode = null
            done(err)
        })
    }
}

在app.js中我有以下代码

var async = require("async");
var express = require("express");
var app =  express();
var db = require("./mongodbUtil");



db.connect('mongodb://localhost:27017/mydatabase', function(err) {
    if (err) {
        console.log('Unable to connect to Mongo.')
        process.exit(1)
    } else {
        app.listen(3000, function() {
            console.log('Listening on port 3000...')
        })
    }
})


app.get('/',function(req,res){
    res.send("routes :/insert ")

})


app.get('/insert',function(req,res){

    var collection = db.get().collection('insertcollection');
    collection.drop();
    var obj = {};

    for (i=0; i <100000 ; i++){
        obj=({id: i, square:i*i,sum:i+i,subtract:i-1,data:"data part 2014"});

        collection.insert(obj.table, function (err, result) {
            if(err) {
                console.log(err);

            } else {
                console.log(i);
            }
        });
    }

})

我在此代码中有以下查询

  1. 我何时应该关闭mongodb中的连接?这是由nodejs mongodb驱动程序隐式处理还是只创建一个连接 在这种情况下池?
  2. 我应该设置具有读取首选项和写入首选项的连接字符串,还是应该将其保留为默认值?
  3. 在插入路径中,集合中只插入约60000条记录。我也没有在mongodb插入回调中看到任何错误。是否有特殊原因导致仅部分数据被转储? (我知道批量插入的性能更好,但我很好奇为什么没有报告错误,只丢弃了部分数据)

1 个答案:

答案 0 :(得分:0)

您有多种选择,您可以为每个请求创建新连接或拥有一个连接池,或者如果您没有像过去那样拥有高流量,则一个连接就可以了。

对于结束部分,如果您在请求中关闭它,如果再次请求该路由,则会出错。让nodejs mongodb驱动程序处理它。

对于部分数据,您正在执行同步循环以执行异步调用。将您的代码更改为:

const promises = [];
for (i=0; i <100000 ; i++){
    promises.push(
        new Promise((resolve, reject) => {
            obj={id: i, square:i*i,sum:i+i,subtract:i-1,data:"data part 2014"};
            collection.insert(obj.table, function (err, result) {
                if(err) {
                    console.log(err);
                    return reject(err);
                } 
                console.log(i);
                return resolve(i);
            });
        })
    );
}

Promise.all(promises)
.then((result) => {
    // if no error in calls
    console.log(reslt);
})
.catch((error) => {
    // if error in calls
});

但是,如果您使用的是本机mongodb驱动程序,则可以使用col.insertMany(),它基本上是一个对象表。这样:

  const objs = [];
  for (i=0; i <100000 ; i++){
      objs.push({id: i, square:i*i,sum:i+i,subtract:i-1,data:"data part 2014"});
  }

  col.insertMany(
      objs, 
      function(err, result) {
          if (err) {
              console.error(err);
              return;
          }
          console.log(result);
      }
  );

希望这有帮助