Collections meteorjs推荐的计数大集合的方法取决于一个值
我的meteorJs应用程序在pge上的性能有问题 情况: 我有两个系列 -生意 -类别 业务是具有一个或多个类别的项目 它的构造如下: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
{
_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的答案。这取决于业务
集合的大小,尤其是在类别
上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数
另一种方法是对每个类别
文档中的业务
文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别
如果你这样做,你可以在更新业务
文档时使用或只是使用一种方法。如果你真的不想去规范化你的数据,我会同意休伯特的答案。这取决于业务
集合的大小,尤其是在类别
上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数
另一种方法是对每个类别
文档中的业务
文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别
如果你这样做,你可以在更新业务
文档时使用或只是使用一种方法。如果你真的不想去规范化你的数据,我会同意休伯特的答案。这取决于业务
集合的大小,尤其是在类别
上有索引的情况下。不利的一面是,你不断地点击你的数据库来获取一个可以预先计算的计数
另一种方法是对每个类别
文档中的业务
文档的数量进行计数。它减少了数据库负载并可以很好地扩展,但是每次修改业务时都需要修改相应的类别
如果你这样做,你可以在更新业务
文档时使用或只是使用一种方法。如果你真的不想去规范化你的数据,我会同意休伯特的答案。德潘迪