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

Meteor:sự khác biệt giữa tên cho bộ sưu tập, biến, ấn phẩm và đăng ký?

Hãy phân biệt giữa các tên khác nhau mà bạn có thể phải xử lý khi lập trình Meteor:

  • Tên biến , chẳng hạn như Posts = new Meteor.Collection(...) . Chúng chỉ được sử dụng để mã của bạn biết cách truy cập biến này. Meteor không biết hoặc không quan tâm nó là gì, mặc dù quy ước là viết hoa.
  • Tên bộ sưu tập , chẳng hạn như new Meteor.Collection("posts") . Điều này liên kết với tên của bộ sưu tập MongoDB (trên máy chủ) hoặc bộ sưu tập minimongo (trên máy khách).
  • Tên xuất bản và đăng ký , được sử dụng trong Meteor.publish("foo", ...) hoặc Meteor.subscribe("foo") . Chúng phải khớp với nhau để khách hàng đăng ký một số dữ liệu trên máy chủ.

Có hai điều bạn cần đối sánh trong mô hình dữ liệu Meteor:

  1. Tên các ấn phẩm và đăng ký tương ứng của chúng
  2. (thường) Tên của bộ sưu tập trên máy khách và máy chủ, nếu sử dụng mô hình bộ sưu tập mặc định

Tên đăng ký cần phải luôn khớp với tên của ấn phẩm. Tuy nhiên, các bộ sưu tập được gửi cho một đăng ký nhất định không liên quan gì đến tên đăng ký. Trên thực tế, người ta có thể gửi nhiều con trỏ trong một ấn phẩm hoặc một bộ sưu tập trên các ấn phẩm khác nhau hoặc thậm chí nhiều đăng ký trên mỗi ấn phẩm , xuất hiện được hợp nhất thành một trong ứng dụng khách. Bạn cũng có thể có các tên bộ sưu tập khác nhau trong máy chủ và máy khách; đọc tiếp ...

Hãy xem xét các trường hợp khác nhau:

  1. Mô hình đăng ký đơn giản . Đây là cái bạn thường thấy trong các bản demo đơn giản của Meteor.

    Trên máy khách và máy chủ,

    Posts = new Meteor.Collection("posts");
    

    Chỉ trên máy chủ:

    Meteor.publish("postsPub", function() { 
        return Posts.find() 
    });
    

    Chỉ dành cho khách hàng:

    Meteor.subscribe("postsPub")
    

    Điều này đồng bộ hóa Posts bộ sưu tập (được đặt tên là posts trong cơ sở dữ liệu) bằng cách sử dụng ấn phẩm có tên postsPub .

  2. Nhiều bộ sưu tập trong một ấn phẩm . Bạn có thể gửi nhiều con trỏ cho một ấn phẩm, bằng cách sử dụng một mảng.

    Trên máy khách và máy chủ:

    Posts = new Meteor.Collection("posts");
    Comments = new Meteor.Collection("comments");
    

    Chỉ trên máy chủ:

    Meteor.publish("postsAndComments", function() { 
        return [ 
            Posts.find(), 
            Comments.find() 
        ]; 
    });
    

    Chỉ dành cho khách hàng:

    Meteor.subscribe("postsAndComments");
    

    Điều này đồng bộ hóa Posts bộ sưu tập cũng như Comments bộ sưu tập bằng cách sử dụng một ấn phẩm duy nhất có tên là postsAndComments . Loại xuất bản này rất thích hợp cho dữ liệu quan hệ; ví dụ:nơi bạn có thể chỉ muốn xuất bản một số bài đăng nhất định và các nhận xét chỉ được liên kết với những bài đăng đó. Xem một gói có thể tự động tạo các con trỏ này .

  3. Nhiều ấn phẩm cho một bộ sưu tập . Bạn có thể sử dụng nhiều ấn phẩm để gửi các phần dữ liệu khác nhau cho một bộ sưu tập được Meteor hợp nhất tự động.

    Trên máy chủ và máy khách:

    Posts = new Meteor.Collection("posts");
    

    Chỉ trên máy chủ:

    Meteor.publish("top10Posts", function() { 
        return Posts.find({}, {
            sort: {comments: -1}, 
            limit: 10
        });
    });        
    Meteor.publish("newest10Posts", function() { 
        return Posts.find({}, {
            sort: {timestamp: -1},
            limit: 10
        }); 
    });
    

    Chỉ dành cho khách hàng:

    Meteor.subscribe("top10Posts");
    Meteor.subscribe("newest10Posts");
    

    Điều này đẩy cả 10 bài đăng có nhiều nhận xét nhất cũng như 10 bài đăng mới nhất trên trang web cho người dùng, điều này thấy cả hai tập hợp dữ liệu được hợp nhất thành một Posts thu thập. Nếu một trong những bài đăng mới nhất cũng là bài đăng có nhiều bình luận nhất hoặc ngược lại, thì Posts bộ sưu tập sẽ chứa ít hơn 20 mục. Đây là ví dụ về cách mô hình dữ liệu trong Meteor cho phép bạn thực hiện các hoạt động hợp nhất dữ liệu mạnh mẽ mà không cần tự triển khai chi tiết.

  4. Nhiều đăng ký trên mỗi ấn phẩm. Bạn có thể lấy nhiều bộ dữ liệu từ cùng một ấn phẩm bằng cách sử dụng các đối số khác nhau.

    Trên máy chủ và máy khách:

    Posts = new Meteor.Collection("posts");
    

    Chỉ trên máy chủ:

    Meteor.publish("postsByUser", function(user) { 
        return Posts.find({
            userId: user
        });
    });        
    

    Chỉ dành cho khách hàng:

    Meteor.subscribe("postsByUser", "fooUser");
    Meteor.subscribe("postsByUser", "barUser");
    

    Điều này khiến các bài đăng của fooUserbarUser để cả hai hiển thị trong posts thu thập. Mô hình này thuận tiện khi bạn có nhiều phép tính khác nhau đang xem xét các phần khác nhau của dữ liệu và có thể được cập nhật động. Lưu ý rằng khi bạn đăng ký bên trong Deps.autorun(...) , Meteor gọi stop() trên bất kỳ xử lý đăng ký nào trước đó có cùng tên tự động, nhưng nếu bạn đang sử dụng các đăng ký này bên ngoài autorun bạn sẽ cần phải tự mình ngăn chặn chúng. Hiện tại, bạn không thể tạo hai đăng ký có cùng tên trong autorun tính toán, bởi vì Meteor không thể phân biệt chúng.

  5. Đẩy dữ liệu tùy ý qua một ấn phẩm. Bạn hoàn toàn có thể tùy chỉnh các ấn phẩm để không yêu cầu các tên bộ sưu tập giống nhau trên máy chủ và máy khách. Trên thực tế, máy chủ có thể xuất bản dữ liệu không được hỗ trợ bởi một bộ sưu tập nào cả. Để làm điều này, bạn có thể sử dụng API cho các chức năng xuất bản .

    Chỉ trên máy chủ:

    Posts = new Meteor.Collection("posts"); 
    
    Meteor.publish("newPostsPub", function() {
        var sub = this;
        var subHandle = null;
    
        subHandle = Posts.find({}, {
            sort: {timestamp: -1},
            limit: 10
        })
        .observeChanges({
            added: function(id, fields) {
                sub.added("newposts", id, fields);            
            },
            changed: function(id, fields) {
                sub.changed("newposts", id, fields);            
            },
            removed: function(id) {
                sub.removed("newposts", id);
            }
        });
    
        sub.ready();
    
        sub.onStop(function() {
            subHandle.stop();
        })    
    });
    

    Chỉ dành cho khách hàng:

    NewPosts = new Meteor.Collection("newposts");
    
    Meteor.subscribe("newPostsPub");
    

    Điều này đồng bộ hóa 10 bài đăng mới nhất từ ​​Posts bộ sưu tập trên máy chủ (được gọi là posts trong cơ sở dữ liệu) vào NewPosts bộ sưu tập trên máy khách (được gọi là newposts trong minimongo) bằng cách sử dụng ấn phẩm / đăng ký có tên newPostsPub . Lưu ý rằng observeChanges khác với observe , có thể làm nhiều việc khác.

    Đoạn mã này có vẻ phức tạp, nhưng khi bạn trả về một con trỏ bên trong một hàm xuất bản, về cơ bản đây là đoạn mã mà Meteor đang tạo ra đằng sau hậu trường. Viết các ấn phẩm theo cách này cho phép bạn kiểm soát nhiều hơn những gì được và không được gửi cho khách hàng. Tuy nhiên, hãy cẩn thận, vì bạn phải tắt observe theo cách thủ công xử lý và đánh dấu khi đăng ký đã sẵn sàng. Để biết thêm thông tin, hãy xem mô tả của Matt Debergalis về quy trình này (tuy nhiên, bài đăng đó đã lỗi thời). Tất nhiên, bạn có thể kết hợp phần này với các phần khác ở trên để có thể có được những ấn phẩm rất phức tạp và có sắc thái.

Xin lỗi vì bài luận :-) nhưng nhiều người nhầm lẫn về điều này và tôi mặc dù sẽ hữu ích nếu mô tả tất cả các trường hợp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cài đặt và chạy MongoDB trên OSX

  2. MongoDB GridFs với C #, làm thế nào để lưu trữ các tệp như hình ảnh?

  3. Nhóm Mongodb và sắp xếp

  4. Tại sao chúng ta cần một 'trọng tài viên' trong việc nhân rộng MongoDB?

  5. Làm cách nào bạn có thể xóa tất cả tài liệu khỏi bộ sưu tập với Mongoose?