我对Meteor很新.我有一个相当小的数据集,<1000条记录的应用程序,我构建了一个相当天真的过滤器为您的类型实现.
现在,性能非常糟糕 - 每个按键都会导致浏览器在相对较快的计算机上遵守冻结一两秒.
它目前已autopublish
启用并正在客户端做一切,我知道这是问题的一个重要部分,我只是不确定如何改进它.
这是相关的代码段:
Template.results.codes = function () { var query = Session.get("query") // todo: figure out if there's a better way to do this var search = (query && query.length > 3) ? {$where: function() { return this.code.indexOf(query) != -1; }} : {} return Codes.find(search); };
您可以在https://github.com/nfriedly/Meteor-ODB-II上查看完整资源,并在http://odb-ii.meteor.com/上试用.
我有的具体问题:
有没有更好的方法来搜索mongo db/minimongo?
是否有直接的方法将搜索移出UI线程?要么是网络工作者,要么只是在服务器上运行它?
有没有办法让我的模板知道"数据仍在加载"和"此集合中没有数据"之间的区别,以便在应用程序最初加载时不会闪烁"找不到结果"消息.
David Weldon.. 5
欢迎来到流星!如果这是一个生产应用程序,我的第一个评论是你不应该使用自动发布 - 尤其不是1k记录.正确的方法是使用更复杂的分页框架.除此之外,我们可以通过一些调整使您当前的UI更快:
您可以使用mongo的regexp运算符,它似乎比使用快得多where
.这本身就是一个巨大的胜利.
isMatch
调用codes
这是一个相当大的性能,因为它重新运行已经很昂贵的查询两次.相反,我们可以用会话变量替换此调用.
直接列出所有1k代码似乎有点傻.我在我的代码中将它限制为100,但在生产应用程序中我再次使用分页.
我将必要的查询长度减少到> 1
看起来仍然很快.但你应该调整味道.
以下是我的更改:
Template.results.codes = function () {
var query = Session.get('query');
var cursor = query && query.length > 1 ? Codes.find({code: new RegExp(query)}) : Codes.find({}, {limit: 100});
Session.set('isMatch', cursor.count() > 0);
return cursor;
};
Template.results.isMatch = function() {
return Session.get('isMatch');
};
这是一个如何在运行后完成这项工作的简单示例meteor remove autopublish
.
向您的客户添加订阅:
Tracker.autorun(function() {
Meteor.subscribe('codes', Session.get('query'));
});
将发布添加到您的服务器:
Meteor.publish('codes', function(query) {
if (query && query.length > 1) {
return Codes.find({code: new RegExp(query)});
} else {
return Codes.find({}, {limit: 100});
}
});
然后,您可以limit
从该Template.results.codes
功能中删除.在发布,我想你会需要调整使用的limits
,并query.length
在一个巧妙的方法,但这应该让你开始.我希望有所帮助!