【问题标题】:MongoDB connection string in nodejsnodejs中的MongoDB连接字符串
【发布时间】:2018-03-06 05:02:27
【问题描述】:

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

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

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

    对于关闭部分,如果你在你的请求中关闭它,如果你再次请求那个路由,你会报错。让 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);
          }
      );
    

    希望对你有帮助

    【讨论】:

    • 所以如果我有很高的流量需求并使用连接池,这是否意味着我不需要在 nodejs 应用程序的生命周期中的任何时候关闭连接。
    • 我不建议关闭连接,但我建议您在获取连接的方式周围使用包装器,以确保有打开的连接,如果没有重新打开一个或多个并将它们添加到游泳池。
    • 如果在 nodejs 应用程序的生命周期内打开连接失败,那么重生 mongodb 连接的最佳方法是什么。另外,如果 /insert 路由的代码是同步的,为什么它能够转储 60k记录而不是在错误回调中出错
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多