gpt4 book ai didi

mongodb - Meteor:集合、变量、发布和订阅的名称之间的区别?

转载 作者:行者123 更新时间:2023-12-02 01:01:20 24 4
gpt4 key购买 nike

在 Discover Meteor 示例中,“帖子”和“帖子”之间的区别是什么?为什么当我们从服务器插入时我们使用“posts”,而当从浏览器查询时我们使用“Posts”?系统不会被大小写差异混淆吗?

我在posts.js 中看到了客户端帖子到服务器帖子的变量分配。将客户端大写并为服务器使用小型大写字母是一种传统的表示法吗?

Posts = new Meteor.Collection('posts')

为什么 server/fixtures.js 使用“Posts”?我假设我们在浏览器(客户端)中查询“帖子”,并在服务器中使用“帖子”,就像我们在 meteor mongo 中所做的那样。那么为什么我们现在在服务器中使用 Posts 呢?

最佳答案

让我们区分在编写 Meteor 时可能需要处理的不同名称:

  • 变量名 ,例如 Posts = new Meteor.Collection(...) .这些仅用于让您的代码知道如何访问此变量。 Meteor 不知道也不关心它是什么,尽管惯例是大写。
  • 集合名称 ,例如 new Meteor.Collection("posts") .这映射到 MongoDB 集合(在服务器上)或 minimongo 集合(在客户端上)的名称。
  • 出版物和订阅名称 ,用于 Meteor.publish("foo", ...)Meteor.subscribe("foo") .这些必须匹配,以便客户端订阅服务器上的某些数据。

  • 您需要在 Meteor 数据模型中匹配两件事:
  • 出版物名称及其相应订阅
  • (通常)客户端和服务器上的集合名称,如果使用默认集合模型

  • 订阅名称需要始终与发布名称匹配。但是,为给定订阅发送的集合与订阅名称没有任何关系。其实可以发过来 一份出版物中的多个游标 不同出版物的合集甚至 每个出版物的多个订阅 ,它们在客户端中合并为一个。您还可以在服务器和客户端使用不同的集合名称;继续阅读……

    让我们回顾一下不同的情况:
  • 简单订阅模式 .这是您通常在简单的 Meteor 演示中看到的。

    在客户端和服务器上,

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

    仅在服务器上:

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

    仅在客户端:

    Meteor.subscribe("postsPub")

    这将同步 Posts使用名为 posts 的出版物的集合(在数据库中名为 postsPub) .
  • 一本出版物中的多个收藏 .您可以使用数组为单个发布发送多个游标。

    在客户端和服务器上:

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

    仅在服务器上:

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

    仅在客户端:

    Meteor.subscribe("postsAndComments");

    这将同步 Posts收藏以及Comments使用名为 postsAndComments 的单个出版物的集合.这种类型的发布非常适合关系数据;例如,您可能只想发布某些帖子以及仅与这些帖子相关的评论。见 a package that can build these cursors automatically .
  • 单个集合的多个出版物 .您可以使用多个发布为单个集合发送不同的数据切片,这些数据由 Meteor 自动合并。

    在服务器和客户端上:

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

    仅在服务器上:

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

    仅在客户端:

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

    这会将评论最多的 10 个帖子以及网站上最新的 10 个帖子推送给用户,用户会看到这两组数据合并为一个 Posts收藏。如果最新帖子之一也是评论最多的帖子,反之亦然,Posts集合将包含少于 20 个项目。这是 Meteor 中的数据模型如何让您无需自己实现细节即可进行强大的数据合并操作的示例。
  • 每个发布有多个订阅。 您可以使用不同的参数从同一出版物中获取多组数据。

    在服务器和客户端上:

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

    仅在服务器上:

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

    仅在客户端:

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

    这导致了 fooUser 的帖子和 barUser两者都出现在 posts 中收藏。当您有多个不同的计算查看数据的不同切片并且可能会动态更新时,此模型非常方便。请注意 when you subscribe inside a Deps.autorun(...) , meteor 来电stop()在任何以前具有相同名称的订阅句柄上自动,但如果您在 autorun 之外使用这些订阅你需要自己阻止它们。截至目前,您不能在 autorun 内进行两个同名订阅。计算,因为 Meteor 无法区分它们。
  • 将任意数据推送到出版物上。 您可以完全自定义发布,以便在服务器和客户端上不需要相同的集合名称。事实上,服务器可以发布完全不受集合支持的数据。为此,您可以使用 API for the publish functions .

    仅在服务器上:

    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();
    })
    });

    仅在客户端:

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

    Meteor.subscribe("newPostsPub");

    这将同步来自 Posts 的最新 10 个帖子。服务器上的集合(在数据库中称为 posts)到 NewPosts使用名为 newposts 的发布/订阅在客户端上收集(在 minimongo 中称为 newPostsPub) .请注意 observeChanges不同于 observe , which can do a bunch of other things .

    代码看起来很复杂,但是当您在发布函数中返回一个游标时,这基本上就是 Meteor 在幕后生成的代码。以这种方式编写出版物可以让您更好地控制发送给客户端的内容和不发送的内容。不过要小心,因为您必须手动关闭 observe处理并标记订阅何时准备就绪。如需更多信息,请参阅 Matt Debergalis' description of this process (但是,该帖子已过时)。当然,您可以将其与上面的其他部分结合起来,以获得非常微妙和复杂的出版物。

  • 很抱歉这篇文章 :-) 但很多人对此感到困惑,我认为描述所有情况会很有用。

    关于mongodb - Meteor:集合、变量、发布和订阅的名称之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863881/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com