Meteor:如何在由ID链接的两个集合之间创建多对多关系?

时间:2017-04-20 19:44:33

标签: javascript mongodb meteor meteor-blaze

我有两个系列。一个称为帖子,另一个称为类别。在帖子集合中,是具有ID的单个帖子。对于此特定帖子,在图片中显示为id: 1291,,这是一个整数,而不是字符串。

enter image description here

第二个集合是类别集合,其中包含每个帖子所属的类别, 最重要的 ,在每个类别中类别集合是属于该类别的帖子数组。请注意posts.ID,在这种情况下为ID: 1291,此ID是帖子集合中的帖子ID

综述

  • 帖子集合中有个人帖子。那些 个人帖子属于不同的类别。
  • 还有 Categories 集合,其中包含各个类别。 每个类别中都包含属于posts数组 该类别,但我可以使用帖子对象

enter image description here

问题

我的流程是这样的。

用户滚动类别列表并点击“类别”集合中的某个类别,目的是查看该类别中的帖子。

<template name="category">
    {{#each categories}}
      <span class="title"><a href="/category/{{_id}}">{{name}}</a></span>
    {{/each}}
</template>

目前,当用户执行此操作时,他们会查看属于类别集合的类别中的帖子(记住类别集合中的posts数组)像这样

Template.singleCategory.helpers({
  categories() {
    var id = FlowRouter.getParam('_id');
    return Categories.find({
      _id: id
    }, {
      sort: {
        timestamp: 1
      },
      limit: 100
    });
  }
});

但是类别集合中的这些帖子没有在帖子集合中找到某些关键对象,而且我想要删除类别中的帖子。< / p>

目标

我不想使用类别集合中的这些帖子,而是想使用帖子集合中的帖子,我想使用他们分享的类似的ID。因此,当用户点击某个类别时,他们应该看到的帖子应来自帖子集合,该集合由类别集合中的post ID链接,该集合是相同的到帖子集合中的post id

代码

这是代码。我想说以下内容:

  

用户在点击其他类别列表后查看此单一类别时,会显示类别集合中嵌入的帖子,相反,返回帖子集合。在此帖子集合中,找到每个post id,然后将其与类别集合中ID的{​​{1}}相匹配,然后展示   来自帖子集合的对象,而不是category.posts

category.posts

然而,我似乎无法让它发挥作用。我收到了错误

  Template.singleCategory.helpers({
      posts(){
        return Posts.find({ ID: {$in: this.posts }});
      }
    });

类别集合中的帖子是一个数组。

我该如何解决这个问题?

被修改

在答案部分的代码基础上,我不得不将category.posts视为一个数组。我得到了我想要的结果,在某种程度上,有些帖子没有通过。我想知道,这段代码可以更好吗?

Exception in template helper: Error: $in needs an array

1 个答案:

答案 0 :(得分:1)

我要做的是在类别集合中使用一个只包含post mongo的_id字段(这是唯一的)。

然后在帮助程序中,您可以查询帖子集合以返回包含这些ID的所有帖子。

所以它会是这样的:

Template.singleCategory.helpers({
  posts(){
    var id = FlowRouter.getParam('_id');
    var category = Category.findOne(id, {sort: {timestamp: 1},limit: 100 })

    var postArray = category.posts
    // example --> ["rCBWsKLCAWghBRJg4", "yMDtnDSo43ZDEcqpu", "cQeJntQtvwiHpgdZ9"]

    return Posts.find( {_id: {$in: postArray}});
    // it will return an array oj objects where each object is a post from the posts collection : [Object, Object, Object]
  }
});

有更好的方法可以做到这一点,但我认为这个解决方案可以解决你的问题,而不会改变太多的东西