【问题标题】:Sorting documents in Meteor.js collection causes browser to crash对 Meteor.js 集合中的文档进行排序会导致浏览器崩溃
【发布时间】:2013-11-30 04:21:33
【问题描述】:

我正在尝试从具有timestamp 字段的集合中检索最新文档。但是,当将 sort 说明符与 find()findOne() 一起使用时,浏览器会变得非常迟钝,CPU 使用率会飙升并且偶尔会崩溃。

与使用 db.fruits.find().sort({timestamp: -1}) 在 mongodb 上直接查询相比,返回的排序结果也未正确排序。 timestamp 字段中的值的示例是 2013-11-28 21:48:02db.fruits 中有 5000 多个文档,索引在 timestamp

任何想法出了什么问题?我在 Mac OSX Chrome 上使用 Meteor v0.6.6.3。

案例 1A:响应式

Template.fruits.fruit = function() {
    var fruit = Fruits.findOne({});
    return fruit;
}

<template name="fruits">
    <div>{{fruit.price}}</div>
</template>

案例 1B:无响应

Template.fruits.fruit = function() {
    var fruit = Fruits.findOne({},{sort:{timestamp: -1}});
    return fruit;
}

案例 2A:响应式

Template.fruits.fruit = function() {
    var fruit = Fruits.find({}, {limit :1});
    return fruit;
}

<template name="fruits">
    {{#each fruit}}
    <div>{{price}}</div>
    {{/each}}
</template>

案例 2B:无响应

Template.fruits.fruit = function() {
    var ticks = Ticks.find({}, {sort:{timestamp: -1}, limit :1});
    return fruit;
}

只发布最新的 10 种水果

大卫·韦尔登建议

Meteor.publish('fruits', function(userId) {
    return Fruits.find({}, {sort:{timestamp: -1}, limit: 10});
});

它会停止浏览器崩溃,并返回正确的结果!

【问题讨论】:

  • 果真多啊!如果您只向客户发布 10 个最新文档而不是全部 5k,会发生什么情况?
  • @DavidWeldon 它停止了浏览器崩溃,并返回了正确的结果!你认为发生了什么?查询一个文档时,为什么只发布少量文档和发布所有文档不同?
  • 当时有没有检查内存使用情况。根据文档,无限排序是在内存中完成的。如果您的资源有限,您可能会以某种方式崩溃。另一方面,消耗高达 32 Mb 的排序是唯一的。

标签: javascript node.js mongodb meteor


【解决方案1】:

我不确定流星是否在将文档发送到客户端时不断尝试对文档进行排序(每次发送新文档时都会重新启动),或者它是否在执行排序之前阻塞了完整的结果集。无论哪种方式,我强烈建议不要将数千个文档同步到客户端。正如您在示例中所说明的那样,它在网络和 CPU 中都是资源密集型的。

您的目标应该是根据需要同步数据库的一小部分。如果您需要对大型数据集进行操作,我建议您使用方法调用(并可能将结果缓存在服务器上)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多