2

有没有办法将同一服务器集合的订阅存储在不同的 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");

有任何想法吗?

4

1 回答 1

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上的按房间计数示例中使用观察来实现,此处详细解释了Meteor 文档中的消息计数示例如何工作?.

虽然这回答了您的问题,即如何在服务器上没有该集合的情况下获取集合的特定名称。我认为您可能更容易通过发布功能更轻松地获得您想要的东西:

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") );
于 2013-07-24T07:52:06.400 回答