Meteor中用于搜索和显示文档的标准模式

时间:2015-08-18 11:45:47

标签: javascript mongodb search meteor

假设我有一个Meteor网站,我想要一个功能来搜索集合中的文档并将其显示给用户。

此集合非常大,无法将所有内容保留在客户端上。

我有一个发布语句,指定需要将哪些文档推送给用户。

Meteor.publish('listing', function (search) {

    return TestObjs.find({"name": search });

});

我有一个搜索输入文本框,当它发生变化时,我想订阅该出版物以获取我需要的记录。

'change #searchText' : function(e,t){
    Session.set("searchTerm", $("#searchText").val());
    Meteor.subscribe("listing", $("#searchText").val());

}

因此,每次搜索文本时,客户端都会收到需要显示的文档。

问题是,订阅呼叫不会从客户端删除以前搜索术语的任何旧文档。所以第一个问题是用户使用搜索功能越多,将在客户端上存储的文档就越多。其次,如果我想显示当前搜索词的搜索结果,我不能只是去

Template.home.helpers({
    listOfObjs: function () {
        return TestObjs.find().fetch();
    }
});

这将返回客户端上的所有记录,这些记录将是与当前和任何先前搜索词匹配的所有记录。

我必须复制发布声明

Template.home.helpers({
    listOfObjs: function () {
        return TestObjs.find({"name": Session.get("searchTerm") }).fetch();
    }
});

这有效,但我基本上在多个地方重复逻辑。这只是一个简单的例子,但是如果我的搜索算法在分页等方面更复杂呢

所以我想知道,推荐的Meteor方法返回服务器上的集合的搜索结果是什么?

1 个答案:

答案 0 :(得分:1)

不试试回答。希望你能找到这个。

    var list;
    'change #searchText' : function(e,t){
        Session.set("searchTerm", $("#searchText").val());

        if (list)
          list.stop();

        list = Meteor.subscribe("listing", $("#searchText").val());

    }

来自doc

stop()取消订阅。这通常会导致服务器指示客户端从客户端的缓存中删除订阅数据。

相关问题