我正在使用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()
电话?
答案 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()
处理程序中。