JavaScript 对象 vs minimongo 效率

JavaScript Object vs minimongo efficiency

我的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]

是否存在一个临界点,无论是在数据大小还是查找次数方面,更有效的方法发生变化,或者超过构建对象的初始成本?

FindOne 在较大的数据集上可能更有效,因为它使用游标查找,其中 _id 是索引键,而您的 find().fetch() 方法需要获取所有文档,然后手动迭代通过映射。

请注意,findOne 也可以替换为 .find({_id:desiredId}).fetch()[0](假设它 returns 所需的文档)。

mongo documentation on query performance 中有更多相关信息。

但是,如果它只涉及一个后来没有被反应跟踪的对象,我宁愿通过服务器的 "findOne"-返回方法加载它:

export const getOne = new ValidatedMethod({
    name: "getOne",
    validate(query) {
        // validate query schema
        // ...
    },
    run(query) {

        // CHECK PERMISSIONS
        // ...

        return MyCollection.findOne(query);
});

这避免了在当前客户端模板上使用发布/订阅,从而避免使用此集合的 minimongo。想一想 pub/sub 已经初始化了一些反应性来观察集合,因此在某处消耗了一些计算量。

我的直觉是,你永远不会达到将它放在对象中的性能增益产生显着差异的地步。

您的瓶颈更有可能出现在pub/sub机制中,因为将所有文档发送给客户端可能需要一段时间。

通过使用 Meteor 方法检索数据,您会发现大型数据集的差异更为明显。

此时你已经在一个普通的旧 javascript 对象中得到了它,因此最终也会获得本机对象查找的小性能提升。