Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections meteorjs推荐的计数大集合的方法取决于一个值_Collections_Meteor - Fatal编程技术网

Collections meteorjs推荐的计数大集合的方法取决于一个值

Collections meteorjs推荐的计数大集合的方法取决于一个值,collections,meteor,Collections,Meteor,我的meteorJs应用程序在pge上的性能有问题 情况: 我有两个系列 -生意 -类别 业务是具有一个或多个类别的项目 它的构造如下: { _id : id, categories : [catid1, catid2, catid3], other data ... } // server Meteor.publish('allBusiness', function(){ return Business.find({}, {reactive : false, fields

我的meteorJs应用程序在pge上的性能有问题

情况: 我有两个系列 -生意 -类别

业务是具有一个或多个类别的项目

它的构造如下:

{
  _id : id,
  categories : [catid1, catid2, catid3],
  other data ...
}
// server
Meteor.publish('allBusiness', function(){
    return Business.find({}, {reactive : false, fields : {_id:1,categories:1}});
});
// client
Meteor.subscribe('allBusiness');
在一个页面上,我显示所有类别,并希望显示有多少业务项具有此类别的id。我测试了几种最好的方法,但所有方法都存在性能问题,因此我正在寻找一种推荐方法

目前我是这样做的:

{
  _id : id,
  categories : [catid1, catid2, catid3],
  other data ...
}
// server
Meteor.publish('allBusiness', function(){
    return Business.find({}, {reactive : false, fields : {_id:1,categories:1}});
});
// client
Meteor.subscribe('allBusiness');
在显示类别的模板中,我使用以下templatehelper:

// template
<li>{{name /* Name of Category*/}} ({{countBusiness _id/* Id of Category*/}})</li>


// handlebars helper
Handlebars.registerHelper('countBusiness', function(id) {
    return Business.find({ 
    categories : { $in : [id] } 
    }).fetch().length;

});
//模板
  • {{name/*name of Category*/}}({{countBusiness}u id/*id of Category*/}})
  • //车把助手 车把.注册表帮助器('countBusiness',功能(id){ 返回业务。查找({ 类别:{$in:[id]} }).fetch().length; });

    “只有”大约1000个业务项(略少于1000个),但是我的本地主机需要大约1分钟的时间来加载,并且当它加载时,所有的内容都是滞后的。有更好的方法解决这个问题吗?

    如果您不需要
    业务
    条目的数据,只需要它们的计数,就不应该订阅它们。这样,您就可以将所有数据发送到客户端,这需要时间

    最简单的解决方案是使用以下方法计算服务器上的值:

    var counts = {};
    var countDep = new Deps.Dependency();
    
    UI.registerHelpers({
      countBusiness: function(id) {
        countDep.depend();
        if(counts[id] === undefined) {
          Meteor.call('countBusiness', id, function(error, result) {
            counts[id] = result;
            countDep.changed();
          });
        }
        return counts[id];
      },
    });
    
    现在是服务器方法。在这里,您应该使用
    .count()
    而不是
    .fetch().length
    ,因为后者仍然需要时间从数据库中获取所有内容

    Meteor.methods({
      countBusiness: function(id) {
        return Business.find({ 
          categories: id,
        }).count();
      },
    });
    

    一个更好的、反应式的解决方案是创建一个虚拟集合,其中包含每个类别的业务计数并订阅它。请参阅
    按房间计数的示例,了解如何进行。

    如果您不需要
    业务
    条目的数据,只需要它们的计数,就不应该订阅它们。这样,您就可以将所有数据发送到客户端,这需要时间

    最简单的解决方案是使用以下方法计算服务器上的值:

    var counts = {};
    var countDep = new Deps.Dependency();
    
    UI.registerHelpers({
      countBusiness: function(id) {
        countDep.depend();
        if(counts[id] === undefined) {
          Meteor.call('countBusiness', id, function(error, result) {
            counts[id] = result;
            countDep.changed();
          });
        }
        return counts[id];
      },
    });
    
    现在是服务器方法。在这里,您应该使用
    .count()
    而不是
    .fetch().length
    ,因为后者仍然需要时间从数据库中获取所有内容

    Meteor.methods({
      countBusiness: function(id) {
        return Business.find({ 
          categories: id,
        }).count();
      },
    });
    

    一个更好的、反应式的解决方案是创建一个虚拟集合,其中包含每个类别的业务计数并订阅它。请参阅
    按房间计数的示例,了解如何进行。

    如果您不需要
    业务
    条目的数据,只需要它们的计数,就不应该订阅它们。这样,您就可以将所有数据发送到客户端,这需要时间

    最简单的解决方案是使用以下方法计算服务器上的值:

    var counts = {};
    var countDep = new Deps.Dependency();
    
    UI.registerHelpers({
      countBusiness: function(id) {
        countDep.depend();
        if(counts[id] === undefined) {
          Meteor.call('countBusiness', id, function(error, result) {
            counts[id] = result;
            countDep.changed();
          });
        }
        return counts[id];
      },
    });
    
    现在是服务器方法。在这里,您应该使用
    .count()
    而不是
    .fetch().length
    ,因为后者仍然需要时间从数据库中获取所有内容

    Meteor.methods({
      countBusiness: function(id) {
        return Business.find({ 
          categories: id,
        }).count();
      },
    });
    

    一个更好的、反应式的解决方案是创建一个虚拟集合,其中包含每个类别的业务计数并订阅它。请参阅
    按房间计数的示例,了解如何进行。

    如果您不需要
    业务
    条目的数据,只需要它们的计数,就不应该订阅它们。这样,您就可以将所有数据发送到客户端,这需要时间

    最简单的解决方案是使用以下方法计算服务器上的值:

    var counts = {};
    var countDep = new Deps.Dependency();
    
    UI.registerHelpers({
      countBusiness: function(id) {
        countDep.depend();
        if(counts[id] === undefined) {
          Meteor.call('countBusiness', id, function(error, result) {
            counts[id] = result;
            countDep.changed();
          });
        }
        return counts[id];
      },
    });
    
    现在是服务器方法。在这里,您应该使用
    .count()
    而不是
    .fetch().length
    ,因为后者仍然需要时间从数据库中获取所有内容

    Meteor.methods({
      countBusiness: function(id) {
        return Business.find({ 
          categories: id,
        }).count();
      },
    });
    

    一个更好的、反应式的解决方案是创建一个虚拟集合,其中包含每个类别的业务计数并订阅它。查看
    按房间计数的示例,了解如何进行计数。

    如果您真的不想对数据进行反规范化,我会同意Hubert的答案。这取决于
    业务
    集合的大小,尤其是在
    类别
    上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数

    另一种方法是对每个
    类别
    文档中的
    业务
    文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别


    如果你这样做,你可以在更新
    业务
    文档时使用或只是使用一种方法。

    如果你真的不想去规范化你的数据,我会同意休伯特的答案。这取决于
    业务
    集合的大小,尤其是在
    类别
    上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数

    另一种方法是对每个
    类别
    文档中的
    业务
    文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别


    如果你这样做,你可以在更新
    业务
    文档时使用或只是使用一种方法。

    如果你真的不想去规范化你的数据,我会同意休伯特的答案。这取决于
    业务
    集合的大小,尤其是在
    类别
    上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数

    另一种方法是对每个
    类别
    文档中的
    业务
    文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别


    如果你这样做,你可以在更新
    业务
    文档时使用或只是使用一种方法。

    如果你真的不想去规范化你的数据,我会同意休伯特的答案。德潘迪