Meteor:如何在两个由 ID 链接的 collections 之间创建 many-to-many 关系?

Meteor: How can I create a many-to-many relationship between two collections linked by ids?

我有两个 collection。一个叫做 Posts,另一个叫做 Categories。在 帖子 collection 中,是具有 ID 的个人 post。在图片中显示为这个特定 post 的 id: 1291,,它是一个整数,而不是一个字符串。

第二个 collection 是 Categories collection,其中包含每个 post 所属的类别,最重要的是,在类别的每个类别中collection是一个数组posts 属于该类别。注意 posts.ID 在本例中是 ID: 1291, 这个 ID 是 post idPosts collection

夏天。

问题

我的流程是这样的。

用户滚动类别列表并单击类别 collection 中的类别,目的是查看该类别中的 post。

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

就目前而言,当用户执行此操作时,他们会查看已属于 类别 collection 的类别中的 post (记住类别 collection 中的 posts 数组)像这样

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

但是 类别 collection 中的这些 post 没有在 帖子中找到的某些键 objects collection,另外我想去掉类别中的 post。

目标

我不想使用 类别 collection 中的 post,而是使用 post 中的 post 帖子 collection 我想使用他们共享的相似 ID 来创建关系。因此,当用户单击某个类别时,他们应该看到的 posts 应该来自 Posts collection,由 post ID 链接Categories collection 与 Posts collection.

中的 post id 相同

代码

这是代码。我想说的是:

In this single category being viewed by the user after they clicked it from the list of other categories, do not show the posts embedded in the Categories collection, Instead, return the Posts collection. In this Posts collection, find each post id, then match it to ID from category.posts within the Categories collection, then Show the objects from Posts collection, not category.posts.

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

但是,我似乎无法让它工作。我收到错误

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

类别 collection 中的 post 是一个数组。

我该如何解决这个问题?

已编辑

基于答案部分的代码,我不得不处理 category.posts 所以它是一个数组。我得到了我想要的结果,嗯,在某种程度上,一些 posts 没有通过。我想知道,这段代码可以更好吗?

Template.Category.helpers({
  categories(){
    var id = FlowRouter.getParam('_id');
//create a variable with the correct category by id
var category = Category.findOne(id, {
  sort: {
    timestamp: 1
  },
  limit: 100
});
console.log(category);
//target ID within posts
var postArray = category.posts;
console.log(postArray);
//treat the object, clean it up to prepare it for becoming an array
      var postArrayStr = JSON.stringify(postArray).replace(/ID/g, '').replace(/\[|\]/g, '').replace(/""/g, '').replace(/:/g, '').replace(/\{|\}/gi, '');
//create an array
      var idsArray = postArrayStr.split(',').map(function(item) {
        return parseInt(item, 10);
      });
//match it to posts id
      var matchi = Posts.find({
  id: {
    $in: idsArray
  }
}).fetch();
      //
      console.log(matchi);
      //return it
      return matchi;

  }

}); 

我要做的是在类别集合中有一个仅包含 post mongo 的 _id 字段(唯一的)的数组。

然后在帮助程序中,您可以查询 post 集合以 return 所有具有这些 ID 的 post。

所以它会是这样的:

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]
  }
});

有更好的方法,但我认为这个解决方案可能会解决您的问题而无需改变太多东西