从出版物中排序并不会导致客户

时间:2016-04-17 17:08:31

标签: mongodb meteor

我正在使用meteor 1.3.2并尝试通过文本查询搜索mongo db集合。

服务器代码 - 我发布了一个名为docsearch的集合,该集合返回另一个名为Docs的集合的查找

Meteor.publish('docsearch', query => {
  if (query) {
    return Docs.find(
      { $text: {
          $search: query
        }
      },
      {
        fields: {
          score: {
            $meta: 'textScore'
          }
        },
        sort: {
          score: {
            $meta: 'textScore'
          }
        }
      }
    );
  }
});

客户端代码 - 我有一个辅助函数,它接受一个查询参数

dataQueryFunc: () => query => {
  if (query !== '' && query.length > 1) {
    Meteor.subscribe('docsearch', query);
    return Docs.find({}, { sort: [["score", "desc"]] }).fetch();
  }
}

无论我在查询中传递什么,我都会获得Docs的常规顺序。我按照OkGrow和JustMeteor编写的教程进行了说明,他们都说这就是它的完成方式。

我错过了什么。在应用中其他位置订阅docs是否会损坏Docs.find()电话?

2 个答案:

答案 0 :(得分:0)

这里的问题是:订阅不在反应环境中。这意味着当客户端第一次订阅特定集合时,服务器会根据查询发布集合并关闭与客户端的连接。

要使订阅无效,您必须将Meteor.subscribe()置于反应性上下文中,即:

Tracker.autorun(function(){
   Meteor.subscribe('docsearch', query));
});

上面的代码仍然不能正常工作,因为Tracker.autorun()会在function()中的反应上下文发生变化时触发。所以,去查询'作为会话变量: 会话变量本身就是被动的

Session.set('query',/*query goes here*/});

Tracker.autorun(function(){
   Meteor.subscribe('docsearch', Session.get('query'));
});

现在,只要在Session变量' query'(代码的任何部分)中遇到更改,订阅会因反应性上下文而发生变化。

您可以使用set命令更改Session变量。

Session.set(<session variable>,<variable value>);

答案 1 :(得分:0)

您的客户端排序似乎不正确。

return Docs.find({}, { sort: [["score", "desc"]] }).fetch();

应该是:

return Docs.find({}, { sort: {score: -1} }).fetch();

另外,您说您的数据查询功能是从助手调用的。情况应该不是这样。根据您执行搜索的方式,该功能需要位于事件处理程序中或模板的.onCreated()处理程序中。