【问题标题】:JavaScript Object vs minimongo efficiencyJavaScript Object vs minimongo 效率
【发布时间】:2017-12-06 08:47:15
【问题描述】:

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

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

【问题讨论】:

    标签: javascript mongodb meteor minimongo


    【解决方案1】:

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

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

    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 已经初始化了一些反应性来观察集合,因此在某处消耗了一些计算。

    【讨论】:

      【解决方案2】:

      我的直觉是,您永远不会达到将其放入对象中的性能提升产生显着差异的地步。

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

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

      此时您已经将它放在一个普通的旧 javascript 对象中,因此最终也会获得原生对象查找的少量性能提升。

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 2011-03-22
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多