Mongodb 如何在Meteor/Minimongo中键入响应时改进过滤器

Mongodb 如何在Meteor/Minimongo中键入响应时改进过滤器,mongodb,meteor,Mongodb,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);
  };
您可以在上查看完整的源代码,并在上进行尝试

我有以下具体问题:

  • 有没有更好的方法搜索mongo db/minimongo
  • 是否有一种直接的方法将搜索移出UI线程?使用web workers还是在服务器上运行它
  • 我的模板是否有办法知道“数据仍在加载”和“此集合中没有数据”之间的区别,以便在应用程序最初加载时不会闪烁“未找到结果”消息

您可以做的最重要的事情之一是在键入搜索时优化为过滤器发布的集合。这里不允许使用自动发布

是一个使用超过80000个单词的字典的示例实现


对于“加载”效果,我将使用Iron Router的
waitOn
方法,链接也将出现在注释中

您可以做的最重要的事情之一是在键入搜索时优化为过滤器发布的集合。这里不允许使用自动发布

是一个使用超过80000个单词的字典的示例实现


对于“加载”效果,我将使用Iron Router的
waitOn
方法,链接也将出现在评论中

欢迎来到meteor!如果这是一个生产应用程序,我的第一条评论是你不应该使用自动发布,尤其是1k记录。正确的方法是使用更复杂的分页框架。除此之外,我们还可以通过一些调整使您当前的UI更快:

  • 您可以使用mongo运算符,这似乎比使用
    where
    要快得多。这本身就是一个巨大的胜利
  • isMatch
    调用
    code
    ,这是一个相当大的性能损失,因为它会两次重新运行一个已经非常昂贵的查询。相反,我们可以用会话变量替换此调用
  • 立即列出所有1k代码似乎有点愚蠢。我在代码中将其限制为100,但在生产应用程序中,我会再次使用分页
  • 我将必要的查询长度减少到仅
    >1
    ,这看起来仍然很快。但你应该根据口味来调整
  • 这是我的零钱:

    Template.results.codes=函数(){
    var query=Session.get('query');
    var cursor=query&&query.length>1?code.find({code:new RegExp(query)}):code.find({},{limit:100});
    Session.set('isMatch',cursor.count()>0);
    返回光标;
    };
    Template.results.isMatch=函数(){
    return Session.get('isMatch');
    };
    

    下面是一个快速示例,说明如何在运行
    meteor remove autopublish
    后实现此功能

    向您的客户端添加订阅:

    Tracker.autorun(函数(){
    Meteor.subscribe('code',Session.get('query'));
    });
    
    将发布添加到服务器:

    Meteor.publish('code',函数(查询){ if(query&&query.length>1){ 返回代码.find({code:newregexp(query)}); }否则{ 返回代码。查找({},{limit:100}); } });
    然后,您可以从
    Template.results.code
    函数中删除
    限制。在发布中,我认为您需要以一种明智的方式调整
    limits
    query.length
    的使用,但这应该可以让您开始。我希望这有帮助

    欢迎来到流星!如果这是一个生产应用程序,我的第一条评论是你不应该使用自动发布,尤其是1k记录。正确的方法是使用更复杂的分页框架。除此之外,我们还可以通过一些调整使您当前的UI更快:

  • 您可以使用mongo运算符,这似乎比使用
    where
    要快得多。这本身就是一个巨大的胜利
  • isMatch
    调用
    code
    ,这是一个相当大的性能损失,因为它会两次重新运行一个已经非常昂贵的查询。相反,我们可以用会话变量替换此调用
  • 立即列出所有1k代码似乎有点愚蠢。我在代码中将其限制为100,但在生产应用程序中,我会再次使用分页
  • 我将必要的查询长度减少到仅
    >1
    ,这看起来仍然很快。但你应该根据口味来调整
  • 这是我的零钱:

    Template.results.codes=函数(){
    var query=Session.get('query');
    var cursor=query&&query.length>1?code.find({code:new RegExp(query)}):code.find({},{limit:100});
    Session.set('isMatch',cursor.count()>0);
    返回光标;
    };
    Template.results.isMatch=函数(){
    return Session.get('isMatch');
    };
    

    下面是一个快速示例,说明如何在运行
    meteor remove autopublish
    后实现此功能

    向您的客户端添加订阅:

    Tracker.autorun(函数(){
    Meteor.subscribe('code',Session.get('query'));
    });
    
    将发布添加到服务器:

    Meteor.publish('code',函数(查询){ if(query&&query.length>1){ 返回代码.find({code:newregexp(query)}); }否则{ 返回代码。查找({},{limit:100}); } });
    然后,您可以从
    Template.results.code
    函数中删除
    限制。在发布中,我认为您需要以一种明智的方式调整
    limits
    query.length
    的使用,但这应该可以让您开始。我希望这有帮助

    <