如何使用MongoDB聚合进行分页?

2023-12-31

我想执行一个进行基本分页的聚合查询:

  1. 查找属于某个特定的所有订单company_id
  2. 订单排序依据order_number
  3. 统计文档总数
  4. 跳至例如文件号码100并传递其余的
  5. 将文档数量限制为例如2并将它们传递下去
  6. 最后返回计数和文档中选定的几个字段

以下是查询的细分:

db.Order.collection.aggregate([

这会找到所有匹配的文档:

  { '$match'    : { "company_id" : ObjectId("54c0...") } },

这对文档进行排序:

  { '$sort'     : { 'order_number' : -1 } },

这会计算文档并传递未修改的文档,但我确信做错了,因为事情从这里开始变得奇怪:

  {
    '$group' : {
      '_id'     : null,
      'count'   : { '$sum' : 1 },
      'entries' : { '$push' : "$$ROOT" }
    }
  },

这似乎跳过了一些文档:

  { "$skip"     : 100 },

这应该限制文档,但它不会:

  { "$limit"    : 2 },

这确实返回计数,但它不返回数组中的文档,而是返回包含每个字段的数组:

  { '$project'  : {
      'count'     : 1,
      'entries'   : {'_id' : "$entries._id", 'order_number' : "$entries.order_number"}
    }
  }
])

这是结果:

[
  { "_id" : null,
    "count" : 300,
    "entries" : [
      {
        "_id" : [ObjectId('5a5c...'), ObjectId('5a5c...')],
        "order_number" : ["4346", "4345"]
      },
      {
        "_id" : [ObjectId('5a5c...'), ObjectId('5a5c...')],
        "order_number" : ["4346", "4345"]
      },
      ...
    ]
  }
]

我哪里理解错了?


计算总数and返回子集,您需要对同一数据集应用分组和跳过/限制。为此,您可以利用facets https://docs.mongodb.com/manual/reference/operator/aggregation/facet/index.html

例如显示第 3 页,每页 10 个文档:

db.Order.aggregate([
    { '$match'    : { "company_id" : ObjectId("54c0...") } },
    { '$sort'     : { 'order_number' : -1 } },
    { '$facet'    : {
        metadata: [ { $count: "total" }, { $addFields: { page: NumberInt(3) } } ],
        data: [ { $skip: 20 }, { $limit: 10 } ] // add projection here wish you re-shape the docs
    } }
] )

它将返回一个包含 2 个字段的文档:

{
    "metadata" : [ 
        {
            "total" : 300,
            "page" : 3
        }
    ],
    "data" : [ 
        {
            ... original document ...
        }, 
        {
            ... another document ...
        }, 
        {
            ... etc up to 10 docs ...
        }
    ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用MongoDB聚合进行分页? 的相关文章

随机推荐

  • docker 运行启动容器,但 localhost 未加载(Windows 10)

    我正在关注本教程 https blog scrapinghub com 2015 03 02 handling javascript in scrapy with splash 使用splash来帮助抓取网页 我安装了Docker工具箱并执
  • 无法从其他设备远程连接 + Vorlon

    Vorlon 仪表板未显示所有连接的设备 我有桌面并安装了 Vorlon 我从笔记本电脑或 ipad 使用此桌面的本地主机 它显示网页 但它没有显示 vorlon 中的设备 但它会显示我是否从同一个桌面打开 我是我的坏人 我正在使用 loc
  • 当对象完成时取消任务

    我有一个启动任务的类 并希望确保该任务在对象被垃圾收集时停止 我已经实现了 IDisposable 模式 以确保如果手动处理对象或在 using 块中使用对象 则任务会正确停止 However 我不能保证最终用户会调用 Dispose 或在
  • 在私有版本的 python 中安装 setuptools

    新手问题 但是 我在系统版本为2 3的主机上安装了python2 7 2 7位于 python2 7 bin python 我想添加一些软件包 例如 MySQLdb 但需要安装工具 说明表明您可以使用 prefix 作为参数 但是 如果我执
  • br 标签在 Haml on Rails 3 中未关闭

    我在让 Haml 关闭 br 标签时遇到问题 我尝试了以下方法但没有成功 br br 我预计这会导致 br 但它总是输出为 br 即使末尾有斜线字符 我还尝试将以下选项添加到 application rb 并且我尝试了environment
  • 用于检查 4 个不同字符组中至少存在 3 个的正则表达式

    我正在尝试编写一个密码验证器 如何查看我提供的字符串是否包含至少 3 个不同的字符组 检查它们是否存在很容易 但至少有 3 个 至少八 8 个字符 至少三个不同的角色组 大写字母 小写字母 numeric 特殊字符 我正在使用 javasc
  • 在 jquery post 中发送长字符串

    我无法在 jquery post 方法中发送长字符串 超过 96 个字符 在 FF12 和 Chrome 18 中测试 我的 servlet 是 public class TestServletAsh extends HttpServlet
  • SoftLayer API 用于了解 VLAN 中的总 IP 和可用 IP

    SoftLayer API 用于了解 VLAN 中的总 IP 和可用 IP Hello 如果我知道某个 VLAN 的总 IP 数和已用 可用 IP 可以使用哪个 APIVLAN ID 我能想到的一种方法是我可以获得 VLAN 的子网 然后在
  • (Python) ValueError:在路径中找不到程序点

    我有以下问题 我在 xUbuntu 操作系统上 我尝试在 Flask 应用程序中使用 networkx 并且我有以下代码 import networkx as nx Creating and initializing graph objec
  • ASP.NET MVC C#:查看记录详细信息时出现对象引用错误

    我是一个 NET 和 MVC 新手 在经历了 ASP 的长时间使用之后 我第一次学习它 现在是时候进行转换 让我构建 Web 应用程序的工作变得更加容易 我一直在浏览 Stephen Walther 的有用视频教程来了解大多数事情 到目前为
  • ICC 汇编输出中的所有这些数字意味着什么?

    使用 ICC 编译时 每条指令后面都是 2 个点分隔的数字 并以哈希符号为前缀 这意味着什么 例如 https gcc godbolt org g g g h codeEditor i j 1 source int testFunction
  • :nth-child(n+4):nth-child(-n+8) 如何选择一系列元素?

    根据http nthmaster com http nthmaster com 当通过 nth child 设置一系列元素的样式时 我们必须这样做 nth child n 4 nth child n 8 如果我们只使用一个 nth chil
  • 自动宽度和 100% 宽度之间的差异

    之前我的假设是width auto宽度设置为内容的宽度 现在我看到它占据了父级的整个宽度 谁能描述一下它们之间的区别吗 宽度自动 像 div 或 p 这样的块级元素的初始宽度是 auto 这使得它扩展以占据其包含块内的所有可用水平空间 如果
  • PHP函数返回NULL而不是数组[重复]

    这个问题在这里已经有答案了 我调用一个执行一些递归并且应该返回一个数组的函数 事实上 被调用函数中 return 语句之前的 var dump 就表明了该数组 然而 调用函数结果的 var dump 显示 NULL 而不是数组 这是调用函数
  • 从 Ruby、PHP 或 Cocoa 访问 Mac 应用程序

    我想通过 Ruby 访问几个不同的 Mac OS X 应用程序 但我会选择 PHP 这些应用程序是Elgato 的turbo 264 和Apple 的iTunes 两者都定义了 Applescript 库 允许我从 Applescript
  • 假冒带有 body 的 get 请求

    由于某种原因 我需要调用 GET 方法 API 并为其传递 json 请求正文 我实在找不到这样的例子 我想知道是否支持使用 feign 我怎样才能使用 feign 做到这一点 是的 Feign 支持它 您可以执行与 POST 请求相同的操
  • 在 10.9 上编译 Swift?

    直到今天下午 当我下载最终版 Xcode 6 时 我才能够在我的 10 9 机器上使用 Swift 现在我得到这个错误 OS X targets using Swift cannot be built against an SDK olde
  • 如何在 WebSphere 中管理 ClassPath

    我的 Websphere v6 1 中的 Web 模块类路径有问题 在我的 WEB INF lib 中 我有大量的 jar 文件 其中包括 xercesImpl jar 和 xmlparserv2 jar 我需要两个罐子都存在 但它们似乎相
  • 在 oracle 12 中搜索逗号分隔值

    我有一张桌子 Product在Oracle中 其中p spc cat id存储为逗号分隔值 p id p name p desc p spc cat id 1 AA AAAA 26 119 27 15 18 2 BB BBBB 0 0 27
  • 如何使用MongoDB聚合进行分页?

    我想执行一个进行基本分页的聚合查询 查找属于某个特定的所有订单company id 订单排序依据order number 统计文档总数 跳至例如文件号码100并传递其余的 将文档数量限制为例如2并将它们传递下去 最后返回计数和文档中选定的几