在Meteor.js集合中对文档进行排序会导致浏览器崩溃

时间:2013-11-29 18:37:12

标签: javascript node.js mongodb meteor

我正在尝试从具有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个水果

David Weldon建议

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

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

1 个答案:

答案 0 :(得分:1)

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

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