2017-09-25 147 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