Meteor:复合发布以从两个集合中获取数据

时间:2015-09-15 21:09:49

标签: javascript meteor

我尝试使用reywood:publish-composite。但是,由于我想加载文章数据和指定的文献资料,我做错了。 我认为我的主要问题是正确设置路由以将数据输入变量,我可以在模板中使用。

我会打开/article/BpsCfbhZuoXfEvREG

publications.js

Meteor.publishComposite('articles', function(){
    return {
        find: function(){
            return Articles.find();
        },
        children: [{
            find: function(article){
                return Literature.find({'article.detail.reference': article._id})
            }
        }]
    }
});

router.js

Router.route('/article/:_id', {
    name: 'article',
    waitOn: function() {
        return Meteor.subscribe('articles'); /* correct? */
    },
    data: function () {
        return { 
            article: Articles.findOne({
                _id: this.params._id
            }),
            references: Literature.find({}) /* guess, this is wrong */
        };
    }
});

文学有这种结构,我正在寻找reference

{
    "_id" : "YAEYvJ7tvXxTvnFtv",
    "article" : [
        {
            "title" : "Article 1",
            "detail" : [
                {
                    "reference" : "BpsCfbhZuoXfEvREG",
                    "year" : 2000,
                }
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

您想要加载单个文章吗?这看起来像你在做什么,但你订阅所有文章。您可以将参数传递给订阅。

waitOn: function () {
  return Meteor.subscribe('article', this.params._id);
}

其次,由于您的文献是一系列对象,因此您应该使用$elemMatch

Meteor.publishComposite('article', function (articleId) {
  check(articleId, String);
  return {
    find: function () {
      return Articles.find(articleId);
    },
    children: [{
      find: function (article) {
        return Literature.find({ 
          'article.detail': {
            $elemMatch: {
              'reference': article._id 
            }
          }
        });
      }
    }]
  }
});