sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-03 07:50:49 30 4
mua khóa gpt4 Nike

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

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

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

Giả sử tôi có một items在服务器上收集数百万条记录。我们还假设:

  • 50 条记录具有 đã bật属性设置为 ĐÚNG VẬY , 和;
  • 100 条记录具有 processed属性设置为 ĐÚNG VẬY .

  • 所有其他人都设置为 SAI .
    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

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

    1 Câu trả lời

    当您想查看项目时,您不能只在客户端使用相同的查询吗?
    在 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/

    30 4 0
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com