2017-09-25 149 views
0

我正在使用mongodb和nodejs。我的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插入回调中也没有看到任何错误。为什么只有部分数据被转储是否有特定的原因? (我知道批量插入的性能更好,但我很好奇为什么没有错误报告,只有部分数据被丢弃)

回答

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); 
     } 
); 

希望这有助于

+0

所以如果我有一个高流量的要求,使用连接池,这是否意味着我不需要的NodeJS应用程序的生命周期内,收于任意点的连接。 – baiduXiu

+0

我不会建议关闭连接,但我会建议您打开连接的方式,确保存在打开的连接,如果不重新打开一个或多个连接并将其添加到池中。 –

+0

如果在nodejs应用程序的生命周期中打开的连接失败,那么重新生成mongodb连接的最佳方式是什么。同样,如果/ insert路由的代码是同步的,为什么它能够转储60k记录并且不会在错误回调 – baiduXiu