首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongoose限制/偏移和计数查询

Mongoose限制/偏移和计数查询
EN

Stack Overflow用户
提问于 2012-12-18 23:03:46
回答 7查看 120.5K关注 0票数 96

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

因此,我总共有57个文档,而用户想要10个文档被20个文档偏移。

我可以想到两种方法,首先查询所有57个文档(以数组形式返回),然后使用array.slice返回所需的文档。第二个选项是运行2个查询,第一个使用mongo的本地'count‘方法,然后使用mongo的本地$limit和$skip聚合器运行第二个查询。

你认为哪一个会扩展得更好?在一个查询中完成所有这些操作,还是运行两个独立的查询?

编辑:

代码语言:javascript
运行
复制
// 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});
    });
});
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-13 22:02:20

我建议你使用两个查询:

  1. db.collection.count()将返回项目总数。这个值存储在Mongo中的某个地方,它不是calculated.
  2. db.collection.find().skip(20).limit(10),这里我假设你可以使用一个按某个字段排序,所以不要忘了在这个字段上添加一个索引。这个查询也会很快。

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

票数 152
EN

Stack Overflow用户

发布于 2019-02-15 14:17:39

您可以在一个查询中使用aggregate(),而不是使用两个单独的查询:

可以更快地获取Aggregate "$facet"Total Count和带有skip & limit的数据

代码语言:javascript
运行
复制
    db.collection.aggregate([

      //{$sort: {...}}

      //{$match:{...}}

      {$facet:{

        "stage1" : [ {"$group": {_id:null, count:{$sum:1}}} ],

        "stage2" : [ { "$skip": 0}, {"$limit": 2} ]
  
      }},
     
     {$unwind: "$stage1"},
  
      //output projection
     {$project:{
        count: "$stage1.count",
        data: "$stage2"
     }}

 ]);

输出如下:-

代码语言:javascript
运行
复制
[{
     count: 50,
     data: [
        {...},
        {...}
      ]
 }]

另外,请看一下https://docs.mongodb.com/manual/reference/operator/aggregation/facet/

票数 27
EN

Stack Overflow用户

发布于 2020-10-16 00:50:13

代码语言:javascript
运行
复制
db.collection_name.aggregate([
    { '$match'    : { } },
    { '$sort'     : { '_id' : -1 } },
    { '$facet'    : {
        metadata: [ { $count: "total" } ],
        data: [ { $skip: 1 }, { $limit: 10 },{ '$project' : {"_id":0} } ] // add projection here wish you re-shape the docs
    } }
] )

而不是使用两个查询来查找总计数并跳过匹配的记录。

$facet是最好的和优化的方法。

  1. 与record

匹配

  1. Find total_count

  1. 跳过record

  1. ,还可以在查询中根据我们的需要重塑数据。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13935733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档