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

Hiểu về Meteor Xuất bản / Đăng ký

Các bộ sưu tập, ấn phẩm và đăng ký là một lĩnh vực khó khăn của Meteor, mà tài liệu có thể thảo luận chi tiết hơn, để tránh nhầm lẫn thường xuyên, đôi khi bị khuếch đại bởi thuật ngữ khó hiểu.

Đây là Sacha Greif (đồng tác giả của DiscoverMeteor) giải thích các ấn phẩm và đăng ký trong một trang trình bày:

Để hiểu đúng tại sao bạn cần gọi find () hơn một lần, bạn cần hiểu cách hoạt động của các bộ sưu tập, ấn phẩm và đăng ký trong Meteor:

  1. Bạn xác định bộ sưu tập trong MongoDB. Chưa có Meteor nào tham gia. Các bộ sưu tập này chứa bản ghi cơ sở dữ liệu (còn được gọi là "tài liệu" bởi cả Mongo và Meteor, nhưng "tài liệu" chung chung hơn bản ghi cơ sở dữ liệu; ví dụ:đặc tả cập nhật hoặc bộ chọn truy vấn cũng là tài liệu - các đối tượng JavaScript chứa field:value cặp).

  2. Sau đó, bạn xác định các bộ sưu tập trên máy chủ Meteor với

    MyCollection = new Mongo.Collection('collection-name-in-mongo')
    

    Các bộ sưu tập này chứa tất cả dữ liệu từ bộ sưu tập MongoDB và bạn có thể chạy MyCollection.find ({...}) trên chúng, sẽ trả về con trỏ (một tập hợp các bản ghi, với các phương thức để lặp qua chúng và trả lại chúng).

  3. Con trỏ này (hầu hết thời gian) được sử dụng để xuất bản (gửi) một bộ hồ sơ (được gọi là "bộ hồ sơ" ). Bạn có thể tùy chọn chỉ xuất bản một số các trường từ các bản ghi đó. Đó là các bộ kỷ lục ( không bộ sưu tập) mà khách hàng đăng ký đến. Việc xuất bản được thực hiện bởi chức năng xuất bản, được gọi mỗi khi khách hàng mới đăng ký và có thể nhận các tham số để quản lý bản ghi nào sẽ trả về (ví dụ:id người dùng, để chỉ trả lại tài liệu của người dùng đó).

  4. Trên khách hàng , bạn có bộ sưu tập Minimongo một phần gương một số của các bản ghi từ máy chủ. "Một phần" vì chúng có thể chỉ chứa một số trường và "một số bản ghi" bởi vì bạn thường chỉ muốn gửi cho khách hàng những bản ghi nó cần, để tăng tốc độ tải trang và chỉ những bản ghi nó cần có quyền truy cập.

    Minimongo về cơ bản là một triển khai trong bộ nhớ, không liên tục của Mongo trong JavaScript thuần túy. Nó phục vụ như một bộ đệm cục bộ chỉ lưu trữ tập hợp con của cơ sở dữ liệu mà ứng dụng khách này đang làm việc. Các truy vấn trên máy khách (find) được phân phát trực tiếp từ bộ nhớ đệm này mà không cần trao đổi với máy chủ.

    Các bộ sưu tập Minimongo này ban đầu trống. Chúng được điền bởi

    Meteor.subscribe('record-set-name')
    

    cuộc gọi. Lưu ý rằng tham số để đăng ký không phải là tên bộ sưu tập; đó là tên của bộ kỷ lục mà máy chủ được sử dụng trong xuất bản gọi điện. subscribe () cuộc gọi đăng ký khách hàng với một bộ hồ sơ - một tập hợp con các bản ghi từ bộ sưu tập máy chủ (ví dụ:100 bài đăng blog gần đây nhất), với tất cả hoặc một tập hợp con của các trường trong mỗi bản ghi (ví dụ:chỉ title ngày ). Làm thế nào Minimongo biết được vào bộ sưu tập nào để đặt các bản ghi đến? Tên của bộ sưu tập sẽ là bộ sưu tập đối số được sử dụng trong được thêm vào của trình xử lý xuất bản , đã thay đổi đã xóa các lệnh gọi lại hoặc nếu chúng bị thiếu (thường xuyên xảy ra trường hợp này), nó sẽ là tên của bộ sưu tập MongoDB trên máy chủ.

Sửa đổi bản ghi

Đây là lúc Meteor làm cho mọi thứ trở nên rất thuận tiện:khi bạn sửa đổi bản ghi (tài liệu) trong bộ sưu tập Minimongo trên máy khách, Meteor sẽ cập nhật ngay lập tức tất cả các mẫu phụ thuộc vào nó và cũng sẽ gửi các thay đổi trở lại máy chủ. sẽ lưu trữ các thay đổi trong MongoDB và sẽ gửi chúng đến các ứng dụng khách thích hợp đã đăng ký tập hợp bản ghi bao gồm tài liệu đó. Đây được gọi là bù đắp độ trễ và là một trong bảy nguyên tắc cốt lõi của Meteor.

Nhiều đăng ký

Bạn có thể có một loạt các đăng ký lấy các bản ghi khác nhau, nhưng tất cả chúng sẽ kết thúc trong cùng một bộ sưu tập trên máy khách nếu chúng đến từ cùng một bộ sưu tập trên máy chủ, dựa trên _id của chúng . Điều này không được giải thích rõ ràng, nhưng được ngụ ý bởi các tài liệu về Meteor:

Khi bạn đăng ký một tập hợp bản ghi, nó sẽ yêu cầu máy chủ gửi các bản ghi đến máy khách. Máy khách lưu trữ các bản ghi này trong bộ sưu tập Minimongo cục bộ, có cùng tên với bộ sưu tập đối số được sử dụng trong được thêm vào của trình xử lý xuất bản , đã thay đổi đã xóa gọi lại. Meteor sẽ xếp hàng các thuộc tính đến cho đến khi bạn khai báo Mongo.Collection trên máy khách với tên bộ sưu tập phù hợp.

Điều không được giải thích là điều gì sẽ xảy ra khi bạn không sử dụng rõ ràng đã thêm , đã thay đổi đã loại bỏ hoặc xuất bản trình xử lý - hầu hết thời gian. Trong trường hợp phổ biến nhất này, đối số bộ sưu tập (không có gì đáng ngạc nhiên) được lấy từ tên của bộ sưu tập MongoDB mà bạn đã khai báo trên máy chủ ở bước 1. Nhưng điều này có nghĩa là bạn có thể có các ấn phẩm và đăng ký khác nhau với các tên khác nhau và tất cả các bản ghi sẽ kết thúc trong cùng một bộ sưu tập trên máy khách. Xuống cấp của trường cấp cao nhất , Meteor quan tâm đến việc thực hiện liên hợp đã đặt giữa các tài liệu, sao cho các mục đăng ký có thể chồng chéo lên nhau - xuất bản các chức năng vận chuyển các trường cấp cao nhất khác nhau cho máy khách làm việc song song với nhau và trên máy khách, tài liệu trong bộ sưu tập sẽ là sự kết hợp của hai tập hợp các trường.

Ví dụ:nhiều đăng ký điền vào cùng một bộ sưu tập trên ứng dụng khách

Bạn có một bộ sưu tập BlogPosts, mà bạn khai báo theo cùng một cách trên cả máy chủ và máy khách, mặc dù nó thực hiện những việc khác nhau:

BlogPosts = new Mongo.Collection('posts');

Trên máy khách, BlogPosts có thể lấy hồ sơ từ:

  1. đăng ký 10 bài đăng trên blog gần đây nhất

    // server
    Meteor.publish('posts-recent', function publishFunction() {
      return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
    }
    // client
    Meteor.subscribe('posts-recent');
    
  2. đăng ký các bài đăng của người dùng hiện tại

    // server
    Meteor.publish('posts-current-user', function publishFunction() {
      return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
      // this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
    }
    Meteor.publish('posts-by-user', function publishFunction(who) {
      return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
    }
    
    // client
    Meteor.subscribe('posts-current-user');
    Meteor.subscribe('posts-by-user', someUser);
    
  3. đăng ký các bài đăng phổ biến nhất

  4. v.v.

Tất cả những tài liệu này đến từ bài viết bộ sưu tập trong MongoDB, qua BlogPosts bộ sưu tập trên máy chủ và kết thúc trong BlogPosts bộ sưu tập trên máy khách.

Bây giờ chúng tôi có thể hiểu tại sao bạn cần gọi find () nhiều lần - lần thứ hai trên máy khách, vì tài liệu từ tất cả các đăng ký sẽ kết thúc trong cùng một bộ sưu tập và bạn chỉ cần tìm nạp những tài liệu bạn quan tâm. Ví dụ:để nhận các bài đăng gần đây nhất trên máy khách, bạn chỉ cần sao chép truy vấn từ máy chủ:

var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});

Thao tác này sẽ trả về một con trỏ đến tất cả các tài liệu / bản ghi mà khách hàng đã nhận được cho đến nay, cả bài đăng hàng đầu và bài đăng của người dùng. (cảm ơn Geoffrey).



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để có được tất cả số lượng mô hình mongoose?

  2. MongoDB forEach ()

  3. Bộ lọc MongoDB $

  4. Mức sử dụng dữ liệu trong bộ đệm của giai đoạn sắp xếp tràn vượt quá giới hạn nội bộ

  5. nhiều phiên bản của Mongo DB trên cùng một máy chủ