1

我的服务器上有一个自定义出版物(以某种方式加入了 2 个集合)。

这本出版物的结果集正是我所需要的,但对于性能问题,我想避免将其完全发送给客户。

如果我不关心表演,我只会订阅出版物并做类似的事情 theCollection.find({"my":"filter"})

因此,我试图找到一种方法来发布自定义发布的子集,以便将过滤器应用于服务器端的自定义发布。

有没有办法链接或过滤发布(服务器端)?

对于这个问题,我们可以假设自定义出版物看起来像这样并且不能修改:

Meteor.publish('customPublication', function() {
    var sub = this;

    var aCursor = Resources.find({type: 'someFilter'});
    Mongo.Collection._publishCursor(aCursor, sub, 'customPublication');

    sub.ready();
  });
4

2 回答 2

1

如果我理解正确的问题,您正在寻找https://atmospherejs.com/reywood/publish-composite

它让您“使用响应式连接发布来自各种集合的一组相关文档。这使得一次发布整个文档树变得容易。发布的集合是响应式的,并且会在添加/更改/删除时更新。”

于 2015-06-04T03:11:28.477 回答
0

好的,我找到了以下解决方法。我没有处理出版物,而是简单地添加了一个我根据其他集合更新的新集合。为了做到这一点,我使用了流星钩子包

function transformDocument(doc)
{
doc.aField = "aValue"; // do what you want here
return doc;
}

ACollection.after.insert(function(userId, doc)
{
    var transformedDocument = transformDocument(doc);
    AnotherCollection.insert(transformedDocument);
});

ACollection.after.update(function(userId, doc, fieldNames, modifier, options)
{
    var transformedDocument = transformDocument(doc);
    delete transformedDocument._id;
    AnotherCollection.update(doc._id,{$set:transformedDocument});
});

ACollection.after.remove(function(userId, doc)
{
    AnotherCollection.remove(doc._id);
});

然后我有了新的集合,我可以以常规方式发布子集

好处:

  • 您可以将任何您想要的内容过滤到此数据库中,无需担心该字段是虚拟的还是真实的
  • 每次数据库更改时只有一次操作。这样可以避免多个出版物合并相同的数据

洞穴吃:

  • 这需要一个集合 = 更多空间
  • 2 db 可能并不总是同步,这有几个原因:
    • 客户端手动更改“AnotherCollection”的数据
    • 在添加“AnotherCollection”之前,您在“ACollection”中有文档。
    • 转换函数或源集合架构在某些时候发生了变化

要解决这个问题:

AnotherCollection.allow({
    insert: function () {
        return Meteor.isServer;
    },
    update: function () {
        return Meteor.isServer;
    },
    remove: function () {
        return Meteor.isServer;
    }
});

并在流星启动时同步(即从头开始构建集合)。仅在维护或添加此新集合之后执行此操作。

Meteor.startup(function()
{
    AnotherCollection.remove({});
    var documents = ACollection.find({}).fetch();
    _.each(documents, function(doc)
    {
    var transformedDocument = transformDocument(doc);
    AnotherCollection.insert(transformedDocument);
    });
});
于 2015-06-04T12:49:06.813 回答