【问题标题】:Meteor: How can I create a many-to-many relationship between two collections linked by ids?Meteor:如何在两个由 id 链接的集合之间创建多对多关系?
【发布时间】:2017-09-17 14:54:24
【问题描述】:

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

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

夏天。

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

问题

我的流程是这样的。

用户滚动类别列表并单击类别集合中的类别,目的是查看该类别中的帖子。

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

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

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

但是 Categories 集合中的这些帖子没有 Posts 集合中的某些关键对象,而且我想摆脱类别中的帖子。

目标

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

代码

这里是代码。我想说的是:

在用户从其他类别列表中单击后查看的单个类别中,显示嵌入在 类别 集合中的帖子,相反,返回 Posts 集合。在这个 Posts 集合中,找到每个 post id,然后将其与 Categories 集合中 category.posts 中的 ID 匹配,然后显示 Posts 集合中的对象,而不是 category.posts

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

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

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

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

我该如何解决这个问题?

已编辑

基于答案部分中的代码,我必须将 category.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;

  }

}); 

【问题讨论】:

  • 您可能应该首先调试您的代码并确保this.posts 确实是您认为的那样。
  • 一个帖子可以属于多个类别吗?
  • 一个帖子可以属于多个类别

标签: javascript mongodb meteor meteor-blaze


【解决方案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]
  }
});

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

【讨论】:

  • 谢谢@Giova.panasiti - 你给了我一个很好的方法,比我做的方法更优雅。我仍然遇到问题,但这与对象“category.posts”的性质有关。我需要它是一个数组,这样我就可以使用 with '$in' 所以我在代码上建立了一个可以获取帖子的点。但是,有些帖子即使在那里也没有被拾取。我还是想不通。无论如何,看看帖子的编辑部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2021-08-27
相关资源
最近更新 更多