如何从游标(集合)中检索n个文档的组

时间:2016-05-06 21:35:34

标签: javascript mongodb meteor

我正在寻找一种方法,在我的模板组中检索具有近50个文档的“问题”集合的3个文档。在模板中显示的前3个文档(问题)之后,如果用户想要检索接下来的3个文档或者只是完成,则用户应该决定(按下按钮)。

我还没有找到从3到3加载问题的方法。这是我的代码:

collections.js:

Questions = new Mongo.Collection("questions");

myapp.js:

var lastQ=0
Template.questions.helpers ({
  getGroupQuestions: function(){
    //Ideally if I only query one time the entire collection, and store in local var
    var listOfQuest = Questions.find({$and: [ {qNumber: {$nin: answeredQ}}, {qNumber:{$gt:lastQ}}]}, {sort:{qNumber:1}}); 

    lastQ = lastQ + 3;
    return {"Obj1":listOfQuest.fetch()[0], "Obj2":listOfQuest.fetch()[1], "Obj3":listOfQuest.fetch()[2]};  //This is not working, the returned object cant be read in template
  }
});

myapp.html:

<template name="questions">
  <h4> Tell us a little about yourself: </h4>
  <form class="js-add-answers" id="add-answers">
    {{#each getGroupQuestions}}
      <label for="{{qNumber}}">{{qDescription}}</label>
      <input type="text" class="form-control" id="{{qNumber}}" placeholder="{{qHints}}"/>
      <p></p>
    {{/each}}
    <button class="btn btn-warning js-join-event">Save and Join</button>
    <button class="btn btn-warning js-load-more">Save and load more Q</button>        
   </form> 
</template>

1 个答案:

答案 0 :(得分:1)

我从你的问题中看到,我只能说你需要在获取文件时在功能中使用跳过限制。理想情况下,您应该删除&#34;不安全&#34;和&#34;自动发布&#34;首先打包并在代码中使用PUB / SUB技术。

以下是可用于获得所需结果的代码。

在服务器端,您应该使用跳过计数发布代码。

<强> PROJECT /服务器/ publish.js

Meteor.publish('getGroupQuestions', function(skipcount){
    return Questions.find(
                          {$and: [ {qNumber : {$nin: answeredQ}},
                                   {sort : {qNumber:1}}
                          },{limit : 3, skip : skipCount}
         });
});

在客户端声明下面的代码作为会话变量,以相应地跳过记录数3;

<强>的客户机/模板/ myapp.js

 Session.setDefault('skip', 0);
 Deps.autorun(function(){
     Meteor.subscribe('getGroupQuestions', Session.get('skip'));
 });

 Template.questions.events ({
    "submit .load-more" : function() {
        Session.set(Session.get('skip') + 3)
    }
 });

在myapp.html中,您必须进行一些小改动,并将按钮命名如下;

<强>的客户机/模板/ myapp.html

<button name="load-more" class="btn btn-warning js-load-more">Save and load more Q</button>
  

流程说明

  1. 最初加载页面时,它会根据逻辑为您提供前3个结果。
  2. 当用户单击加载更多的按钮时,将调用模板事件并使用新值&#34设置会话;跳过&#34; (增加3)。
  3. 由于Meteor重新活动和异步行为,发布容器将通过再次触发相同的查询但在会话中使用新的跳过计数器,使用接下来的3个问题自动更新集合。 该页面甚至不会刷新,您将获得新的问题组。