我的Meteor客户端从服务器接收数据并将其存储在minimongo中。保证这些数据在会话期间不会改变,因此我不需要Meteor的反应性。静态数据恰好通过该路线到达;让我们把它作为给定的。
数据如下所示:
{_id: 'abc...', val: {...}}
在客户端上,使用以下方式查找值是否更有效:
val_I_need = Collection.findOne({id})
或创建JavaScript对象:
data = {}
Collection.find().fetch().map((x) => {data[x._id] = x.val})
并将其用于查找:
val_I_need = data[id]
是否存在一个临界点,无论是数据大小还是查找次数,更有效的方法更改,还是超过构建对象的初始成本?
答案 0 :(得分:1)
FindOne
在更大的数据集上可能更有效,因为它使用游标查找_id
是索引键,而find().fetch()
方法需要获取所有文档,然后通过映射手动迭代
请注意,findOne也可以替换为.find({_id:desiredId}).fetch()[0]
(假设它返回所需的文档)。
mongo documentation on query performance中的更多内容。
但是,如果它只涉及一个后来没有被反应跟踪的对象,我宁愿通过服务器上的" findOne" -returning方法加载它:
export const getOne = new ValidatedMethod({
name: "getOne",
validate(query) {
// validate query schema
// ...
},
run(query) {
// CHECK PERMISSIONS
// ...
return MyCollection.findOne(query);
});
这可以避免在当前客户端模板上使用发布/订阅,从而最小化此集合。想想pub / sub已经初始化了一些反应,以观察集合,从而在某处进行一些计算。
答案 1 :(得分:0)
我的直觉是,你永远不会达到将它放入物体的性能提升产生明显差异的程度。
您的瓶颈更可能出现在pub / sub机制中,因为将所有文档发送给客户端可能需要一段时间。
通过使用Meteor方法检索数据,您将看到大型数据集的显着差异。
无论如何,你已经在一个普通的旧javascript对象中获得了它,因此最终也获得了原生对象查找的小的性能提升。