Kết nối mongodb không xác định

Từ phiên bản trình điều khiển 1. 2, chúng tôi đã giới thiệu một Lớp kết nối mới có cùng tên trên tất cả các trình điều khiển chính thức của chúng tôi. Điều này là để đảm bảo rằng chúng tôi trình bày một mặt trận dễ nhận biết cho tất cả các API của chúng tôi. Điều này không có nghĩa là ứng dụng hiện tại của bạn sẽ bị hỏng, mà đúng hơn là chúng tôi khuyến khích bạn sử dụng api kết nối mới để đơn giản hóa quá trình phát triển ứng dụng của bạn

Hơn nữa, lớp kết nối mới MongoClient thừa nhận tất cả các ghi vào MongoDB, trái ngược với lớp kết nối hiện tại Db đã tắt xác nhận. Hãy tham quan các chức năng MongoClient

MongoClient = function(server, options);

MongoClient.prototype.open

MongoClient.prototype.close

MongoClient.prototype.db

MongoClient.connect

Phác thảo ở trên là giao diện MongoClient hoàn chỉnh. Các phương thức mở, đóng và db hoạt động rất giống với các phương thức hiện có trên lớp Db. Sự khác biệt chính là hàm tạo thiếu tên cơ sở dữ liệu từ Db. Hãy hiển thị một kết nối đơn giản bằng cách sử dụng mã mở như một ví dụ về một nghìn từ

var MongoClient = require('mongodb').MongoClient
  , Server = require('mongodb').Server;

var mongoClient = new MongoClient(new Server('localhost', 27017));
mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("mydb");

  mongoClient.close();
});

Lưu ý rằng bạn định cấu hình MongoClient giống như bạn đã thực hiện đối tượng Db. Sự khác biệt chính là bạn truy cập các phiên bản db bằng cách sử dụng phương thức db trên đối tượng MongoClient thay vì sử dụng trực tiếp phiên bản Db như trước đây. MongoClient hỗ trợ các tùy chọn giống như phiên bản Db trước đó mà bạn đã tạo

Vì vậy, với một thay đổi tối thiểu trong ứng dụng của chúng tôi, chúng tôi có thể áp dụng mã kết nối MongoClient mới. Nhưng có nhiều và một hướng bạn có thể xem xét trong tương lai. Đó là chuỗi kết nối mongodb

Định dạng kết nối URL

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

Định dạng URL được thống nhất giữa các trình điều khiển chính thức từ 10gen với một số tùy chọn không được hỗ trợ trên một số trình điều khiển vì lý do tự nhiên. Những cái không được hỗ trợ bởi Node. trình điều khiển js bị loại bỏ vì mục đích đơn giản

Các phần cơ bản của url

  • mongodb. // là tiền tố bắt buộc để xác định rằng đây là một chuỗi ở định dạng kết nối tiêu chuẩn
  • tên tài khoản. mật khẩu @ là tùy chọn. Nếu được cung cấp, trình điều khiển sẽ cố gắng đăng nhập vào cơ sở dữ liệu sau khi kết nối với máy chủ cơ sở dữ liệu
  • host1 là phần bắt buộc duy nhất của URI. Nó xác định tên máy chủ, địa chỉ IP hoặc ổ cắm tên miền unix
  • portX là tùy chọn và mặc định là. 27017 nếu không được cung cấp
  • /database là tên của cơ sở dữ liệu để đăng nhập và do đó chỉ có liên quan nếu tên người dùng. mật khẩu @ cú pháp được sử dụng. Nếu không được chỉ định, cơ sở dữ liệu “quản trị viên” sẽ được sử dụng theo mặc định
  • ?options là các tùy chọn kết nối. Lưu ý rằng nếu không có cơ sở dữ liệu thì vẫn có / bắt buộc giữa Máy chủ cuối cùng và ? . Các tùy chọn là các cặp tên=giá trị và các cặp được phân tách bằng dấu “&”. Đối với bất kỳ tùy chọn nào không được nhận dạng hoặc không được hỗ trợ, trình điều khiển nên ghi cảnh báo và tiếp tục xử lý. Trình điều khiển không được hỗ trợ bất kỳ tùy chọn nào không được xác định rõ ràng trong thông số kỹ thuật này. Điều này là để giảm khả năng các trình điều khiển khác nhau sẽ hỗ trợ chồng chéo khác nhau theo những cách nhỏ nhưng không tương thích (như tên khác nhau, giá trị khác nhau hoặc giá trị mặc định khác nhau)

Cấu hình bộ bản sao

  • replicaSet=tên
    • Trình điều khiển xác minh rằng tên của bộ bản sao mà nó kết nối khớp với tên này. Ngụ ý rằng các máy chủ được cung cấp là một danh sách hạt giống và trình điều khiển sẽ cố gắng tìm tất cả các thành viên của tập hợp
    • Không có giá trị mặc định

Cấu hình kết nối

  • ssl=true. sai. thích hơn
    • ĐÚNG VẬY. trình điều khiển khởi tạo từng kết nối với SSL
    • sai. trình điều khiển khởi tạo từng kết nối không có SSL
    • thích hơn. trình điều khiển cố gắng bắt đầu từng kết nối bằng SSL và quay lại không có SSL nếu không thành công
    • Giá trị mặc định là sai
  • connectTimeoutMS=ms
    • Một kết nối có thể mất bao lâu để được mở trước khi hết thời gian chờ
    • Hành vi của trình điều khiển hiện tại đã khác về điều này, do đó, mặc định phải được để lại cho mỗi trình điều khiển. Đối với các triển khai mới, mặc định sẽ không bao giờ hết thời gian chờ
  • socketTimeoutMS=ms
    • Thời gian gửi hoặc nhận trên ổ cắm có thể mất bao lâu trước khi hết thời gian chờ
    • Hành vi của trình điều khiển hiện tại đã khác về điều này, do đó, mặc định phải được để lại cho mỗi trình điều khiển. Đối với các triển khai mới, mặc định sẽ không bao giờ hết thời gian chờ

Cấu hình nhóm kết nối

  • maxPoolSize=n. Số lượng kết nối tối đa trong nhóm kết nối
    • Giá trị mặc định là 5

Viết cấu hình quan tâm

Thông tin chi tiết hơn về mối quan tâm viết có thể được tìm thấy tại http. //www. mongodb. org/display/DOCS/getLastError+Command

  • w=wGiá trị
    • Đối với các giá trị số trên 1, trình điều khiển thêm { w. wValue } vào lệnh getLastError
    • wValue thường là một số, nhưng có thể là bất kỳ chuỗi nào để cho phép các thông số kỹ thuật như “đa số”
    • Giá trị mặc định là 1
    • wValue == -1 bỏ qua lỗi mạng
    • wValue == 0 không ghi xác nhận
    • wValue == 1 thực hiện ghi nhận
    • wValue == 2 thực hiện xác nhận ghi trên chính và một phụ
    • wValue == ‘đa số’ thực hiện xác nhận ghi trên phần lớn các máy chủ trong bộ bản sao
    • wValue == ‘tên thẻ’ thực hiện xác nhận ghi đối với tên thẻ bản sao
  • wtimeoutMS=ms
    • Trình điều khiển thêm { wtimeout. ms } vào lệnh getlasterror
    • Được sử dụng kết hợp với w
    • Không có giá trị mặc định
  • tạp chí = đúng. sai
    • ĐÚNG VẬY. Đồng bộ hóa với tạp chí
    • sai. trình điều khiển không thêm j vào lệnh getlasterror
    • Giá trị mặc định là sai
  • fsync=true. sai
    • ĐÚNG VẬY. Đồng bộ hóa với đĩa
    • sai. trình điều khiển không thêm fsync vào lệnh getlasterror
    • Giá trị mặc định là sai
    • Nếu các giá trị xung đột cho fireAndForget và bất kỳ mối lo ngại ghi nào được thông qua thì trình điều khiển sẽ đưa ra một ngoại lệ về xung đột

tùy chọn xác thực

  • authSource=chuỗi. Được sử dụng khi người dùng xác thực được lưu trữ trong cơ sở dữ liệu khác bằng xác thực gián tiếp
    • Giá trị mặc định là null

đọc tùy chọn

  • nô lệOk=true. sai. Liệu trình điều khiển được kết nối với bộ bản sao sẽ gửi các lần đọc tới nô lệ/thứ cấp hay không
    • Giá trị mặc định là sai
  • readPreference=enum. Tùy chọn đọc cho kết nối này. Nếu được đặt, nó sẽ ghi đè bất kỳ giá trị SlaveOk nào
    • Giá trị liệt kê
    • chủ yếu
    • chínhPreferred
    • thứ hai
    • trung họcPreferred
    • gần nhất
    • Giá trị mặc định là chính
  • readPreferenceTags=chuỗi. Biểu diễn của bộ thẻ dưới dạng danh sách các cặp khóa-giá trị được phân tách bằng dấu hai chấm, e. g. dc. này, giá đỡ. 1. Các khoảng trắng phải được loại bỏ từ đầu và cuối của tất cả các khóa và giá trị. Để chỉ định danh sách các bộ thẻ, sử dụng nhiều thẻ readPreferenceTags, hãy. g. readPreferenceTags=dc. này, giá đỡ. 1&readPreferenceTags=dc. ny&readPreferenceTags=
    • Lưu ý giá trị trống, nó cung cấp dự phòng cho bất kỳ máy chủ phụ nào khác nếu không có sẵn
    • Thứ tự quan trọng khi sử dụng nhiều readPreferenceTags
    • Không có giá trị mặc định

MongoClient. liên kết

Định dạng url có thể được sử dụng với MongoClient. liên kết. Nếu có thể, MongoClient sẽ chọn các giá trị mặc định tốt nhất có thể cho các tùy chọn nhưng chúng có thể bị ghi đè. Điều này bao gồm đặt auto_reconnect thành true và native_parser thành true nếu có. Dưới đây là một số ví dụ về cách kết nối với một máy chủ duy nhất, một bản sao và một hệ thống phân mảnh bằng MongoClient. liên kết

Kết nối máy chủ duy nhất

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/integration_test", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Theo mặc định, một bộ bản sao kết nối không sử dụng xác nhận và readPreference cho phụ

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:30000,localhost:30001/integration_test_?w=0&readPreference=secondary", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Theo mặc định, một kết nối được phân đoạn không sử dụng xác nhận và readPreference cho phụ

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:50000,localhost:50001/integration_test_?w=0&readPreference=secondary", function(err, db) {
  test.equal(null, err);
  test.ok(db != null);

  db.collection("replicaset_mongo_client_collection").update({a:1}, {b:1}, {upsert:true}, function(err, result) {
    test.equal(null, err);
    test.equal(1, result);

    db.close();
    test.done();
  });
});

Lưu ý rằng khi kết nối với hệ thống phân mảnh, nó gần như giống với url để kết nối với bản sao. Điều này là do trình điều khiển tự xác định xem đó là một bản sao hay một bộ proxy Mongos mà nó đang kết nối với. Không cần chăm sóc đặc biệt để chỉ định nếu đó là cái này hay cái kia. Điều này trái ngược với việc phải sử dụng các phiên bản ReplSet hoặc Mongos khi sử dụng lệnh mở

Tổng hợp kết nối MongoClient

Nhóm kết nối là bộ nhớ cache của các kết nối cơ sở dữ liệu do trình điều khiển duy trì để có thể sử dụng lại các kết nối khi cần có kết nối mới với cơ sở dữ liệu. Để giảm số lượng nhóm kết nối được tạo bởi ứng dụng của bạn, chúng tôi khuyên bạn nên gọi MongoClient. kết nối một lần và sử dụng lại biến cơ sở dữ liệu được gọi lại

var express = require('express');
var mongodb = require('mongodb');
var app = express();

var MongoClient = require('mongodb').MongoClient;
var db;

// Initialize connection once
MongoClient.connect("mongodb://localhost:27017/integration_test", function(err, database) {
  if(err) throw err;

  db = database;

  // Start the application after the database connection is ready
  app.listen(3000);
  console.log("Listening on port 3000");
});

// Reuse database object in request handlers
app.get("/", function(req, res) {
  db.collection("replicaset_mongo_client_collection").find({}, function(err, docs) {
    docs.each(function(err, doc) {
      if(doc) {
        console.log(doc);
      }
      else {
        res.end();
      }
    });
  });
});

MongoClient. tùy chọn kết nối

Chức năng kết nối cũng có một hàm băm các tùy chọn được chia thành db/server/replset/mongos cho phép bạn điều chỉnh các tùy chọn không được định dạng chuỗi url hợp nhất hỗ trợ trực tiếp. Để sử dụng các tùy chọn này, bạn chuyển qua một hàm băm như thế này