如何匹配来自一个集合的整数与另一个集合中的整数相同,从而创建多对多关系。

时间:2017-05-16 01:30:13

标签: javascript mongodb meteor meteor-collections

这应该是流星中一个简单的多对多关系,但我必须遗漏一些东西,因为我无法让它发挥作用。

我有一个名为 reblog 的集合,其中有一个名为descovered的整数数组,请参阅图像

enter image description here

我有第二个名为帖子的集合,这是一个帖子的集合,这些帖子有一个id。看看第二张图片

enter image description here

我想在帖子 reblog 集合之间创建多对多的关系。即,我想匹配整数

descovered: 9

来自reblog集合,其中包含:

id: 9

来自帖子集合的

,以便我只能显示与 reblog 集合匹配的帖子。这当然会允许我显示帖子的标题和其他属性。

这是我的js

Template.reblogging.helpers({
descovered() {
  var id = FlowRouter.getParam('_id');

  //fetch the reblog collection contents

  var rebloged = reblog.find().fetch();

  //log below is showing that the fetch is successful because i can see the objects fetched in console

  console.log(rebloged);

  //create the relationship between the posts collection and the reblog collection

  var reblogger = posts.find({
    id: {
      $in: rebloged
    }
  }).fetch();

  //nothing is showing with the log below, so something is going wrong with the line above?

  console.log(reblogger);
  return reblogger
}
});

我必须遗漏一些东西,因为这似乎是一件非常简单的事情,但它并不是在担心

我的HTML就像这样

<template name="reblogging">
 {{#each descovered }}
<ul class="">
  <li>
    <h5 class="">{{title.rendered}}</h5>
  </li>
</ul>
{{/each}}
</template>

2 个答案:

答案 0 :(得分:1)

您不需要转换为字符串和解析,您可以直接在游标上使用.map()来创建descovered值的数组。此外,由于您使用Blaze,您只需返回光标而不是数组。我怀疑你还想在你的第一个_id中使用你的FlowRouter .find()参数。如果你没有,那么就没有必要在你的助手中得到那个参数。

Template.reblogging.helpers({
  descovered() {
    const id = FlowRouter.getParam('_id');
    const reblogArr = reblog.find(id).map(el => { return el.descovered });    
    return posts.find({ id: { $in: reblogArr } });
  }
);

答案 1 :(得分:0)

事实证明,匹配是准确的,但是,来自reblog集合的数据需要用REGEX来处理除了我需要的值以外的所有其他内容,然后将它们转换为数组,这是最终的代码。把它留在这里,希望它能帮助将来的某个人。

Template.reblogging.helpers({
descovered() {
  var id = FlowRouter.getParam('_id');

  //fetch the reblog collection contents

  var rebloged = reblog.find().fetch();

  //log below is showing that the fetch is successful because i can see the objects fetched in console

  console.log(rebloged);

  //turn it into a string so i can extract only the ids
  var reblogString = JSON.stringify(rebloged).replace(/"(.*?)"/g, '').replace(/:/g, '').replace(/{/g, '').replace(/}/g, '').replace(/,,/g, ',').replace(/^\[,+/g, '').replace(/\]+$/g, '');
  //after  have extracted what i needed, i make it into an array
  var reblogArr = reblogString.split(',').map(function(item) {
    return parseInt(item, 10);
  });

  //create the relationship between the posts collection and the reblog collection

  var reblogger = posts.find({
    id: {
      $in: reblogArr
    }
  }).fetch();

  //nothing is showing with the log below, so something is going wrong with the line above?

  console.log(reblogger);
  return reblogger
}
});