MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Node.js sử dụng lại tham chiếu 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);
    });
  });
});

Kết quả:

thành công:

thất bại:

[Câu trả lời gốc]:

Bạn đang mở db nhiều lần (một lần trong mỗi query ). Bạn chỉ nên mở cơ sở dữ liệu một lần và sử dụng db đối tượng trong lệnh gọi lại để sử dụng sau này.

Bạn đang sử dụng cùng một tên biến nhiều lần và điều đó có thể gây ra một số nhầm lẫn.

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;

Tôi đã thay đổi đoạn mã trên một chút (db1 cho db gốc, db2 cho đã mở db). Như bạn có thể thấy, bạn đang mở db1 nhiều lần, điều đó là không tốt. trích xuất mã để mở sang một phương thức khác và sử dụng nó MỘT LẦN và sử dụng db2 ví dụ cho tất cả các truy vấn của bạn / cập nhật / loại bỏ / ...



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. truy vấn mongo:tìm số mảng trong tất cả các tài liệu của một bộ sưu tập

  2. MongoDB $ isoWeekYear

  3. Thứ tự Key có quan trọng trong tài liệu MongoDB BSON không?

  4. Spring Data MongoDB có hỗ trợ tính năng đối chiếu MongoDB 3.4 không?

  5. Cắt dấu ngoặc kép trong json nhận được từ mongoDB