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

Ví dụ về số lượng tin nhắn trong tài liệu Meteor hoạt động như thế nào?

Cảm ơn vì đã nhắc tôi viết một lời giải thích rõ ràng hơn. Đây là một ví dụ đầy đủ hơn với nhận xét của tôi. Có một vài lỗi và sự mâu thuẫn mà tôi đã làm sạch. Bản phát hành tài liệu tiếp theo sẽ sử dụng điều này.

Meteor.publish là khá linh hoạt. Nó không giới hạn trong việc xuất bản các bộ sưu tập MongoDB hiện có cho khách hàng:chúng tôi có thể xuất bản bất kỳ thứ gì chúng tôi muốn. Cụ thể, Meteor.publish xác định một bộ tài liệu mà khách hàng có thể đăng ký. Mỗi tài liệu thuộc về một số tên bộ sưu tập (một chuỗi), có một _id duy nhất và sau đó có một số tập hợp các thuộc tính JSON. Khi các tài liệu trong tập hợp thay đổi, máy chủ sẽ gửi các thay đổi đến từng máy khách đã đăng ký, giúp máy khách luôn cập nhật.

Chúng ta sẽ xác định một tập hợp tài liệu ở đây, được gọi là "counts-by-room" , chứa một tài liệu duy nhất trong bộ sưu tập có tên "counts" . Tài liệu sẽ có hai trường:một roomId với ID của một phòng và count :tổng số tin nhắn trong phòng đó. Không có bộ sưu tập MongoDB thực nào có tên counts . Đây chỉ là tên của bộ sưu tập mà máy chủ Meteor của chúng tôi sẽ gửi xuống máy khách và lưu trữ trong phía máy khách bộ sưu tập có tên count .

Để làm điều này, chức năng xuất bản của chúng tôi cần một roomId tham số sẽ đến từ ứng dụng khách và quan sát truy vấn của tất cả Thư (được xác định ở nơi khác) trong phòng đó. Chúng tôi có thể sử dụng observeChanges hiệu quả hơn hình thức quan sát một truy vấn ở đây vì chúng tôi sẽ không cần tài liệu đầy đủ mà chỉ cần biết rằng một tài liệu mới đã được thêm vào hoặc bị xóa. Bất cứ lúc nào một tin nhắn mới được thêm vào với roomId chúng tôi quan tâm đến, cuộc gọi lại của chúng tôi làm tăng số lượng nội bộ và sau đó xuất bản một tài liệu mới cho khách hàng với tổng số được cập nhật đó. Và khi một tin nhắn bị xóa, nó sẽ giảm số lượng và gửi cho khách hàng bản cập nhật.

Khi chúng tôi gọi lần đầu tiên observeChanges , một số added các lệnh gọi lại sẽ chạy ngay lập tức cho mỗi tin nhắn đã tồn tại. Sau đó, các thay đổi trong tương lai sẽ kích hoạt bất cứ khi nào thư được thêm vào hoặc xóa.

Chức năng xuất bản của chúng tôi cũng đăng ký một onStop trình xử lý để dọn dẹp khi khách hàng hủy đăng ký (theo cách thủ công hoặc khi ngắt kết nối). Trình xử lý này loại bỏ các thuộc tính khỏi máy khách và loại bỏ observeChanges đang chạy .

Chức năng xuất bản chạy mỗi khi khách hàng mới đăng ký "counts-by-room" , vì vậy mỗi ứng dụng khách sẽ có một observeChanges thay mặt cho nó.

// server: publish the current size of a collection
Meteor.publish("counts-by-room", function (roomId) {
  var self = this;
  var count = 0;
  var initializing = true;

  var handle = Messages.find({room_id: roomId}).observeChanges({
    added: function (doc, idx) {
      count++;
      if (!initializing)
        self.changed("counts", roomId, {count: count});  // "counts" is the published collection name
    },
    removed: function (doc, idx) {
      count--;
      self.changed("counts", roomId, {count: count});  // same published collection, "counts"
    }
    // don't care about moved or changed
  });

  initializing = false;

  // publish the initial count. `observeChanges` guaranteed not to return
  // until the initial set of `added` callbacks have run, so the `count`
  // variable is up to date.
  self.added("counts", roomId, {count: count});

  // and signal that the initial document set is now available on the client
  self.ready();

  // turn off observe when client unsubscribes
  self.onStop(function () {
    handle.stop();
  });
});

Bây giờ, trên máy khách, chúng tôi có thể coi điều này giống như một đăng ký Meteor thông thường. Đầu tiên, chúng ta cần một Mongo.Collection điều đó sẽ giữ tài liệu về số lượng được tính toán của chúng tôi. Vì máy chủ đang xuất bản thành một bộ sưu tập có tên "counts" , chúng tôi vượt qua "counts" làm đối số cho Mongo.Collection phương thức khởi tạo.

// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");

Sau đó, chúng tôi có thể đăng ký. (Bạn thực sự có thể đăng ký trước khi khai báo bộ sưu tập:Meteor sẽ xếp hàng các bản cập nhật đến cho đến khi có nơi để đặt chúng.) Tên của đăng ký "counts-by-room" và cần một đối số:ID của phòng hiện tại. Tôi đã bọc cái này bên trong Deps.autorun sao cho Session.get('roomId') thay đổi, khách hàng sẽ tự động hủy đăng ký số lượng phòng cũ và đăng ký lại số lượng phòng mới.

// client: autosubscribe to the count for the current room
Tracker.autorun(function () {
  Meteor.subscribe("counts-by-room", Session.get("roomId"));
});

Cuối cùng, chúng tôi đã có tài liệu trong Counts và chúng tôi có thể sử dụng nó giống như bất kỳ bộ sưu tập Mongo nào khác trên máy khách. Bất kỳ mẫu nào tham chiếu đến dữ liệu này sẽ tự động vẽ lại bất cứ khi nào máy chủ gửi một số lượng mới.

// client: use the new collection
console.log("Current room has " + Counts.findOne().count + " messages.");


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoose save vs insert vs create

  2. Mongoid hay MongoMapper?

  3. Kết nối NodeJS với MongoDB Droplet

  4. Kết nối SSL tự ký bằng PyMongo

  5. Các phương pháp hay nhất để sao lưu cơ sở dữ liệu