Meteor.js:在一个集合上有多个订阅会在一个本地集合中强制执行存储结果(Workarounds?)

时间:2013-06-17 14:47:27

标签: meteor

有没有办法在不同的minimongo集合中存储同一服务器集合的订阅?

如果没有最佳做法可以解决?

我的汇总表中有50k数据集,文档中有很多细节。

// Server
var collection = new Meteor.Collection("collection");
Meteor.publish("detail", function (id) {
   return collection.find({_id: id});
});
// A pager that does not include the data (fields:{data:0})
Meteor.publish("master", function (filter, sort, skip, limit) {
   return collection.find({name: new RegExp("^" + filter + "|\\s" + filter, "i")}, {limit: limit, skip: skip, sort: options, fields: {data: 0}});
});

// Client
var collection = new Meteor.Collection("collection");
Deps.autorun(function () {
  Meteor.subscribe("master",
      Session.get("search"),
      Session.get("sort"),
      Session.get("skip"),
      Session.get("limit")
  );
  Meteor.subscribe("detail", Session.get("selection"));
});

上面的问题:两个订阅都被输入到同一个集合中。

如果查找结果存储在同一本地集合中,则此方法无效。

拥有一个包含订阅/发布名称的本地集合会很棒。

// Client
var detail = new Meteor.Collection("detail"),
    master = new Meteor.Collection("master");

任何想法?

1 个答案:

答案 0 :(得分:3)

如果您希望客户端集合与服务器端集合具有不同的名称,则不能只返回集合游标。这可以在发布功能中完成,但是这样:

Meteor.publish("details", function (id) {  //details here matches the subscribe request
  var self = this;

  self.added( "details", id, collection.findOne({_id: id});  //details here tells the client which collection holds the data
  self.ready();
});

这不会被动反应,但可以通过使用观察来实现,如http://docs.meteor.com中的房间示例所示,How does the messages-count example in Meteor docs work?详细说明。

虽然这解决了如何在服务器上没有该集合的情况下获取集合的特定名称的问题。我认为你可能更容易得到你想要的发布功能:

Meteor.publish("master", function (filter, sort, skip, limit, id) {

  return [ 
    collection.find({name: new RegExp("^" + filter + "|\\s" + filter,     "i")}, {limit: limit, skip: skip, sort: options, fields: {data: 0}})
    , collection.find( id , {fields: {data: 1}} )
    ];
});

然后在客户端订阅:

Deps.autorun(function () {
  Meteor.subscribe("master",
    Session.get("search"),
    Session.get("sort"),
    Session.get("skip"),
    Session.get("limit"),
    Session.get("selection")
  );
});

然后,即使您的所有数据都在一个集合中,您也可以使用包含数据的反应光标到您选择的ID。来自客户端的查询如下:

collection.find( Session.get("selection") );