0

我需要创建一个出版物,它为我提供了集合中的一组文档。在这里,您可以看到这些文档是如何相互关联的:

{ 
    "_id" : "peRuJcPMDzZgTvWSX", 
    "author" : "author", 
    "type" : "article", 
    "parent" : "mnfTFfZ7Fqcu6ZJ7T", 
    "ancestors" : [ "hbSycmNNvmdqvpchX", "mnfTFfZ7Fqcu6ZJ7T" ] 
}
{ 
    "_id" : "mnfTFfZ7Fqcu6ZJ7T", 
    "article" : "article", 
    "parent" : "hbSycmNNvmdqvpchX", 
    "ancestors" : [ "hbSycmNNvmdqvpchX" ] 
}
{ 
    "_id" : "hbSycmNNvmdqvpchX", 
    "title" : "title", 
    "ancestors" : [ ] 
}

所以我知道的是第一个文档的 ID,我还需要出版物中的所有祖先。

Meteor.publish('list', function(id) {
    check(id, String);
    return Collection.find({}); // WRONG: gives me ALL documents
    return Collection.find({ _id: id }) // WRONG: gives me only the first document (main)
    // NEEDED: Main document and all ancestors
});
4

2 回答 2

1

你需要先做一个.findOne()然后返回一个游标数组:

Meteor.publish('list', function(id) {
  check(id, String);
  const ancestors = Collection.findOne(id).ancestors;
  if ( ancestors ){
    return [ Collection.find(id), Collection.find({_id: {$in: ancestors}})];
  } else {
    return Collection.find(id);
  }
});

您也可以使用一个单次执行此.find()操作,$or但可能会更慢。

于 2016-11-15T20:55:27.140 回答
0

您可以使用此发布组合在 Meteor中发布连接关系:

Meteor.publishComposite('list', function(id) {
  // checking here ...

  return {
    find() {
      return Collection.find(id);
    },
    children: [{
      find(doc) {
        return Collection.find({
          _id: {
            $in: doc.ancestors
          }
        });
      },
    }],
  };
});

这个包确保您的发布是反应性的,例如,如果ancestors更改的值发布到客户端的数据应该更新以反映该更改。如果你只是findOne在发布中使用获取ancestors列表,那么发送给客户端的数据不会在值ancestors更改时更新

于 2016-11-16T01:41:22.393 回答