Search code examples
meteormeteor-blaze

How can i can display fields from an item from Collection B referenced by an id from an item from Collection A?


i have two collections

CategoryCollection = new Mongo.Collection("CategoryCollection");
usersWordpressCollection = new Mongo.Collection("usersWordpressCollection");

CategoryCollection hold posts within a category, within the posts objects there is the Author, which comes as an id. take a look at the image below, draw your attention to posts.author

enter image description here

usersWordpressCollection holds the authors whose id (see image below) is referenced in categoryCollection under posts.author

enter image description here

when i display a post, its coming from categoryCollection so i can get the post, the link etc. i can also get the author id however when it comes to this, i want to return, not the id, but the referenced Author information found in the usersWordpressCollection

latest html

<template name="latest">

  <ul>
      {{#each articles}}
        <li class=" home-latest ">
            <span class="label">  <a class="" href="/catsingle/CategorySingle/{{_id}}">{{name}}</a></span>
        {{#each posts}}
          <div class="card">
            <div class="category-img">{{{image}}}</div>
          <div class="card-divider">
          {{title}}
          </div>
          <div class="card-section">
          <p>
            {{> authors}}
          </p>
          </div>
          </div>

      </li>
        {{/each}}
  </ul>
</template>

latest js

Template.latest.helpers({
  articles: function () {
    var id = FlowRouter.getParam('_id');
    return CategoryCollection.find({}, {sort: {date_created: -1}, limit:1}).fetch();
  }
});

authors html

<template name="authors">

{{#each authors}}
<p>
  {{name}}
</p>
{{/each}}
</template>

authors js

Template.authors.helpers({
  authors: function () {
  var id = this.author;
 console.log(id);
var alias = usersWordpressCollection.findOne(id, {fields: {name: 1} });
return alias.name;
console.log(alias.name);
});

As you can see, this.author is the author id found in categoryCollection posts.author. Im trying to find that id in the usersWordpressCollection matching the author, then i want to display the name field of the Author whose id was matched. but i can't seen to get it working, how can i achieve this.


Solution

  • Since there is only one author per post you don't need to iterate over a cursor of authors, you only need one. So where you have:

    {{#each authors}}
      <p>
        {{name}}
      </p>
    {{/each}}
    

    Instead use:

    {{#with author}}
      <p>
        {{name}}
      </p>
    {{/with}}
    

    Now, the data context coming into the authors template will be a post object (since you are within an {{#each posts}}. You can therefore construct your author helper as follows:

    Template.authors.helpers({
      author(){
        return usersWordpressCollection.findOne({ id: parseInt(this.author) });
      }
    });
    

    Since you've indicated that this.author is a string but the id of your user collection is an integer then you need to convert the type - you can do this directly in your query.