gpt4 book ai didi

collections - 发布/订阅同一服务器集合的多个子集

转载 作者:行者123 更新时间:2023-12-03 07:50:49 28 4
gpt4 key购买 nike

编辑:这个问题、一些答案和一些评论,包含很多错误信息。见 how Meteor collections, publications and subscriptions work准确理解发布和订阅同一服务器集合的多个子集。

如何将服务器上单个集合的不同子集(或“ View ”)作为客户端上的多个集合发布?

这是一些伪代码来帮助说明我的问题:
items服务器上的集合

假设我有一个 items在服务器上收集数百万条记录。我们还假设:

  • 50 条记录具有 enabled属性设置为 true , 和;
  • 100 条记录具有 processed属性设置为 true .

  • 所有其他人都设置为 false .
    items:
    {
    "_id": "uniqueid1",
    "title": "item #1",
    "enabled": false,
    "processed": false
    },
    {
    "_id": "uniqueid2",
    "title": "item #2",
    "enabled": false,
    "processed": true
    },
    ...
    {
    "_id": "uniqueid458734958",
    "title": "item #458734958",
    "enabled": true,
    "processed": true
    }

    服务器代码

    让我们发布同一个服务器集合的两个“ View ”。一个将向下发送带有 50 条记录的游标,另一个将向下发送带有 100 条记录的游标。在这个虚构的服务器端数据库中有超过 4.58 亿条记录,客户端不需要知道所有这些(事实上,在这个例子中,将它们全部发送下来可能需要几个小时):
    var Items = new Meteor.Collection("items");

    Meteor.publish("enabled_items", function () {
    // Only 50 "Items" have enabled set to true
    return Items.find({enabled: true});
    });

    Meteor.publish("processed_items", function () {
    // Only 100 "Items" have processed set to true
    return Items.find({processed: true});
    });

    客户端代码

    为了支持延迟补偿技术,我们被迫声明一个集合 Items在客户端上。缺陷在哪里应该很明显:如何区分 Itemsenabled_itemsItemsprocessed_items ?
    var Items = new Meteor.Collection("items");

    Meteor.subscribe("enabled_items", function () {
    // This will output 50, fine
    console.log(Items.find().count());
    });

    Meteor.subscribe("processed_items", function () {
    // This will also output 50, since we have no choice but to use
    // the same "Items" collection.
    console.log(Items.find().count());
    });

    我当前的解决方案涉及猴子修补 _publishCursor 以允许使用订阅名称而不是集合名称。但这不会做任何延迟补偿。每次写入都必须往返于服务器:
    // On the client:
    var EnabledItems = new Meteor.Collection("enabled_items");
    var ProcessedItems = new Meteor.Collection("processed_items");

    安装猴子补丁后,这将起作用。但是进入离线模式,更改不会立即出现在客户端上——我们需要连接到服务器才能看到更改。

    正确的做法是什么?

    编辑:我刚刚重新访问了这个线程,我意识到,就目前而言,我的问题和答案以及过多的评论带有很多错误信息。

    归根结底是我误解了发布订阅关系。我认为当你发布一个游标时,它会作为一个单独的集合登陆客户端,与来自同一服务器集合的其他发布的游标不同。这根本不是它的工作原理。这个想法是客户端和服务器都有相同的集合,但不同的是集合中的内容。 pub-sub 契约(Contract)协商哪些文档最终会出现在客户端上。汤姆的回答在技术上是正确的,但缺少一些细节来扭转我的假设。我根据汤姆的解释在另一个 SO 线程中回答了一个类似的问题,但请记住我最初对 Meteor 发布订阅的误解: Meteor publish/subscribe strategies for unique client-side collections

    希望这可以帮助那些遇到这个线程并且比任何事情都更困惑的人!

    最佳答案

    当您想查看项目时,您不能只在客户端使用相同的查询吗?
    在 lib 目录中:

    enabledItems = function() {
    return Items.find({enabled: true});
    }
    processedItems = function() {
    return Items.find({processed: true});
    }
    在服务器上:
    Meteor.publish('enabled_items', function() {
    return enabledItems();
    });
    Meteor.publish('processed_items', function() {
    return processedItems();
    });
    在客户端
    Meteor.subscribe('enabled_items');
    Meteor.subscribe('processed_items');

    Template.enabledItems.items = function() {
    return enabledItems();
    };
    Template.processedItems.items = function() {
    return processedItems();
    };
    如果您考虑一下,这种方式会更好,就好像您插入(本地)一个既已启用又已处理的项目,它可以出现在两个列表中(与您有两个单独的集合相反)。
    笔记
    我意识到我有点不清楚,所以我已经扩展了一点,希望它有所帮助。

    关于collections - 发布/订阅同一服务器集合的多个子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632452/

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