sql >> データベース >  >> NoSQL >> MongoDB

Node.jsはMongoDBリファレンスを再利用します

    mydb.js

    var mongodb= require('mongodb'),
      server = new mongodb.Server('staff.mongohq.com', 10030, {
        auto_reconnect: true
      }),
      db1 = new mongodb.Db('mydb', server);
    
    
    // callback: (err, db)
    function openDatabase(callback) {
      db1.open(function(err, db) {
        if (err)
          return callback(err);
    
        console.log('Database connected');
    
        return callback(null, db);
      });
    }
    
    // callback: (err, collection)
    function authenticate(db, username, password, callback) {
      db.authenticate(username, password, function(err, result) {
        if (err) {
          return callback (err);
        }
        if (result) {
          var collection = new mongodb.Collection(db, 'test');
    
          // always, ALWAYS return the error object as the first argument of a callback
          return callback(null, collection);
        } else {
          return callback (new Error('authentication failed'));
        }
      });
    }
    
    exports.openDatabase = openDatabase;
    exports.authenticate = authenticate;
    

    use.js

    var mydb = require('./mydb');
    // open the database once
    mydb.openDatabase(function(err, db) {
      if (err) {
        console.log('ERROR CONNECTING TO DATABASE');
        console.log(err);
        process.exit(1);
      }
    
      // authenticate once after you opened the database. What's the point of 
      // authenticating on-demand (for each query)?
      mydb.authenticate(db, 'usernsame', 'password', function(err, collection) {
        if (err) {
          console.log('ERROR AUTHENTICATING');
          console.log(err);
          process.exit(1);
        }
    
        // use the returned collection as many times as you like INSIDE THE CALLBACK
        collection.find({}, {limit: 10})
        .toArray(function(err, docs) {
          console.log('\n------ 1 ------');
          console.log(docs);
        });
    
        collection.find({}, {limit: 10})
        .toArray(function(err, docs) {
          console.log('\n------ 2 ------');
          console.log(docs);
        });
      });
    });
    

    結果:

    成功時:

    失敗時:

    [元の回答]:

    dbを開いています 複数回(各queryに1回) )。データベースを一度だけ開いて、dbを使用する必要があります 後で使用するためのコールバック内のオブジェクト。

    同じ変数名を複数回使用しているため、混乱が生じている可能性があります。

    var mongodb = require('mongodb'),
        server = new mongodb.Server('staff.mongohq.com', 10030, {
            auto_reconnect: true
        }),
        db1 = new mongodb.Db('mydb', server);
    
    function authenticateAndGo(db, handle) {
        db.authenticate('username', 'password', function(err) {
            if (err) {
                console.log(err);
                return;
            }
            console.log('Database user authenticated');
    
            var collection = new mongodb.Collection(db, 'test');
    
            handle(collection);
        });
    }
    
    function query(handle) {
        db1.open(function(err, db2) {
            if( err ) {
                console.log(err);
                return;
            }
            console.log('Database connected');
    
            authenticateAndGo(db2, handle);
        });
    };
    exports.query = query;
    

    上記のコードを少し変更しました(db1 元のdbの場合、db2 開いた db)。ご覧のとおり、db1を開いています。 何度も、それは良くありません。別のメソッドを開くためのコードを抽出し、それを1回使用して、db2を使用します。 すべてのクエリ/更新/削除/...のインスタンス



    1. celery celerybeatはDjangoなしでデータベーススケジューラを使用できますか?

    2. mongo-templateを使用してデータをグループ化する方法

    3. MongoDBは、ReactiveMongoがすでに存在する場合にドキュメントを更新します

    4. MongoDB-エラー:無効なスキーマ、予期されるmongodb