复杂的collection.find()查询并使用{{#each collection}}呈现它

时间:2016-03-16 22:34:20

标签: javascript meteor

我有一个系列"会员"在MongoDB中使用这个初始数据:

        Members.insert({
            event: 1,
            username: "Juan Machado",
            answers: ["Tennis", "Golf", “Bowling”]
        });

        Members.insert({
            event: 1,
            username: "Elvis Crespo",
            answers: [“FootBall”, “Tennis”, “Squash”]
        });

        Members.insert({
            event: 1,
            username: "Roman Santos",
            answers: [“Golf”, “Bowling”]
        });

如果已登录的用户是第一个插入的用户(“Juan Machado”),我想向他显示在同一项运动中匹配的其他成员的用户名,在我的渲染模板中显示如下内容:

“Juan Machado”这是你的比赛:

  • “Roman Santos”与您匹配:1。高尔夫| 2.保龄球
  • “Elvis Crespo”与您匹配:1。网球

如何使用{{#Each Members}}在Meteor中进行操作?我很难执行collection.find({})查询,也无法在我的模板中进行渲染。

2 个答案:

答案 0 :(得分:1)

首先,通过id而非用户名将用户保存在mebers集合中,因为用户名更改而id不会。接下来的体育运动,我建议一系列运动。然后通过使用此查询,您可以检查元素是否在数组中: {"answers": {$in: [element]}}。首先使用this._id在帮助程序中查找当前用户。然后通过他的is(或你现在的用户名)从基地拉一个doc。然后获取他的答案数组并使用foreach循环来完成它们。剩下的就是让你决定如何去做。

备注当您在HTML中执行每个操作时,您可以为成员集合执行此操作,并在此范围内调用帮助程序。

答案 1 :(得分:1)

首先让我们来寻找匹配的成员。您将要使用以下命令从服务器发布此内容:

Meteor.publish('matchingMembers',function(){
  let username = Meteor.users.find({ _id: this.userId }).username;
  if ( username ){
    let myAnswers = Members.find({ username: username }).answers;
    if ( myAnswers ){
      return Members.find({ answers: { $in: myAnswers }});
    }
  }
});

在您的模板中,假设您已订阅该出版物并已准备就绪,您需要:

{{#each otherMembers}}
  {{username}} matches with you in:
  {{#each matchingAnswers}}
    {{this}}
  {{/each}}
{{/each}}

您需要以下帮助者:

Template.myTemplate.helpers({
  otherMembers: function(){
    let myUsername = Meteor.user().username;
    return Members.find({ username: { $ne: myUsername }});
  },
  matchingAnswers: function(){
    let myAnswers = Members.findOne({ username: Meteor.user().username }).answers;
    // return the intersection of the other member's answers with the current user
    return _.intersection(this.answers,myAnswers); /
  }
});