查询性能有点奇怪...我需要运行一个查询,它会对文档进行总数计算,还可以返回一个可以限制和偏移的结果集.

所以,我总共有57个文档,用户希望用10个文档抵消20个文档.

我可以想出两种方法,首先是查询所有57个文档(作为数组返回),然后使用array.返回他们想要的文件.第二个选项是运行两个查询,第一个使用mongo的原生"count"方法,然后使用mongo的原生$limit和$skip聚合器运行第二个查询.

你认为哪一个能更好地扩展?在一个查询中完成这一切,还是运行两个独立的查询?

编辑:

// 1 query
var limit = 10;
var offset = 20;

Animals.find({}, function (err, animals) {
    if (err) {
        return next(err);
    }

    res.send({count: animals.length, animals: animals.slice(offset, limit + offset)});
});


// 2 queries
Animals.find({}, {limit:10, skip:20} function (err, animals) {            
    if (err) {
        return next(err);
    }

    Animals.count({}, function (err, count) {
        if (err) {
            return next(err);
        }

        res.send({count: count, animals: animals});
    });
});

推荐答案

我建议您使用两个查询:

  1. db.collection.count()将返回项目总数.该值存储在Mongo中的某个位置,不进行计算.

  2. db.collection.find().skip(20).limit(10)在这里,我假设您可以使用某个字段的排序,所以不要忘记在该字段上添加索引.这个查询也会很快.

我认为你不应该查询所有的项目,而应该执行跳过和执行,因为以后当你有 Big Data 时,你会在数据传输和处理方面遇到问题.

Mongodb相关问答推荐

用嵌套对象替换对象数组中的子字符串

Select 筛选聚合中的嵌套字段

MongoDb聚合查询问题

mongo.lock 文件有什么用?

删除一对一和一对多引用 - Mongoose

Meteor mongo 驱动程序可以处理 $each 和 $position 运算符吗?

mongodb 中的 --bindip 配置选项有什么作用?

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

mongodump 是否锁定数据库?

在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流

mongodb无法启动

在 mongodb 的一次更新调用中推送到两个单独的数组

无法从 javascript 打印 BSON 对象

Mongoose 不创建新集合

如何使用 MongoDB 和 Mongoid 在 Rails 3 上进行适当的数据库测试 (TDD)

MongoDB 范围查询中 $lt 和 $gt 的顺序

MongoDB MapReduce - 发出一个键/一个值不调用reduce

从 mongo 结果中删除 _id

MongoDB mongoexport 查询

MongoDB 的 MMAPV1、WiredTiger 或 In-Memory StorageEngine 如何 Select ?