计算给定记录的跳过值以进行排序分页

2024-03-18

我正在尝试使用 php 驱动程序计算 mongo db 集合中给定记录的跳过值。因此,获取给定的记录,找出该记录在整个集合中的索引。这可能吗?

目前,我正在选择所有记录并手动对结果数组进行索引。


这称为“前向分页”,这是一个概念,您可以在使用“排序”结果时沿“前向”方向“有效地分页”结果。

包含 JavaScript 逻辑(因为它在 shell 中工作),但并不难翻译。

一般概念:

{ "_id": 1, "a": 3 },
{ "_id": 2, "a": 3 },
{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },
{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }

将那些“已排序”文档(为了方便起见)视为我们希望每页按“两个”项目“分页”的结果示例。

在第一种情况下,你会做这样的事情:

var lastVal = null,
    lastSeen = [];

db.collection.find().sort({ "a": -1 }).limit(2).forEach(function(doc) {
    if ( lastVal != doc.a ) {
        lastSeen = [];
    }
    lastVal = doc.a;
    lastSeen.push( doc._id );
    // do something useful with each document matched
});

现在那些lastVal and lastSeen是存储在“会话变量”之类的东西中,可以在 Web 应用程序的下一个请求中访问,或者是其他类似的东西。

它们应该包含的是您排序的最后一个值和“唯一”列表_id由于该值没有改变而看到的值。因此:

lastVal = 3,
lastSeen = [1,2];

关键是,当出现“下一页”的请求时,您希望将这些变量用于类似这样的事情:

var lastVal = 3,
    lastSeen = [1,2];

db.collection.find({ 
    "_id": { "$nin": lastSeen }, 
    "a": { "$lte": lastVal }
}).sort({ "a": -1 }).limit(2).forEach(function(doc) {
    if ( lastVal != doc.a ) {
        lastSeen = [];
    }
    lastVal = doc.a;
    lastSeen.push( doc._id );
    // do something useful with each document matched
});

其作用是“排除”所有值_id记录在lastSeen从结果列表中,并确保所有结果都需要“小于或等于”(降序排列)lastVal记录排序字段“a”。

这会在集合中产生接下来的两个结果:

{ "_id": 3, "a": 3 },
{ "_id": 4, "a": 2 },

但处理后我们的值现在看起来像这样:

lastVal = 2,
lastSeen = [4];

所以现在的逻辑是你不需要排除其他_id之前看到的值,因为您实际上只是在寻找“a”的值,而不是“小于或等于”lastVal因为只有“一个”_id在该值处看到的值则仅排除该值。

这当然会产生使用与上面相同的代码的下一页:

{ "_id": 5, "a": 1 },
{ "_id": 6, "a": 0 }

一般来说,这是通过结果“转发页面”的最有效方式,并且对于“排序”结果的高效分页特别有用。

但是,如果您想“跳转”到页面20或任何阶段的类似行为,那么这不适合您。你被传统束缚了.skip() and .limit()方法能够通过“页码”来做到这一点,因为没有其他合理的方法来“计算”这一点。

因此,这完全取决于您的应用程序如何实现“分页”以及您可以接受的内容。这.skip() and .limit()方法会受到“跳过”性能的影响,可以通过使用此处的方法来避免。

另一方面,如果您想要“跳转到页面”,那么“跳过”是您唯一真正的选择,除非您想构建结果的“缓存”。但这完全是另一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算给定记录的跳过值以进行排序分页 的相关文章

随机推荐

  • 如何切换不同版本的gem安装?

    我在本地计算机上安装了三个版本的机架 rack 1 4 1 1 3 6 1 3 5 对于某些宝石 例如Cucumber 它需要较低版本rack被激活 我尝试过bundle但也没有什么好处 执行时 cucumber仍将使用激活的机架版本1 4
  • 反汇编Java字节码的Java程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我最近正在阅读有关字节码分析的内容 我需要以下查询的帮助 如果我想编写一个反汇编 Java 字节码 通过读取类文件 并打印操作码的 J
  • 如何在 MVC 4 中实现自定义 OpenID 依赖方

    我喜欢新的 MVC OpenID OAuth 登录功能 但我想知道如何添加新的登录按钮 例如我希望我的用户使用他们的 StackExchange 帐户或使用他们的 OpenID url 登录 就像在 stackoverflow 中一样htt
  • Fiddler 重新发行以及作曲家编辑和重新发行

    我在日常生活中使用 Fiddler 然而 对我来说最常用的功能 例如Reissue and Edit and Reissue from composer没有任何捷径 我不知道如何为此使用 fiddler 脚本 有人能指出这个问题的解决方案吗
  • 如何使用 Material ui Reactjs 禁用今天日期中的过去日期?

    我正在使用 React Material ui 创建日期范围选择器 我此功能背后的逻辑是选择所需日期 如果已选择所需日期 则禁用所选日期中的所有过去日期 如何实现这个react材质ui 这是我的代码 import React from re
  • struts 2将属性标签的值分配给隐藏字段

    我想将字段描述中的值分配给隐藏字段测试 但问题是 描述 包含单词序列 并且以下代码仅将第一个单词分配给 测试
  • 何时考虑 Solr

    我正在开发一个应用程序 需要通过搜索来做有趣的事情 包括全文搜索 命中突出显示 分面搜索等 该数据集可能有 3000 10000 条记录 每条记录有 20 30 个字段 并且全部存储在 MySQL 中 该网站的流量概况可能是中小型 所有这些
  • 如何将可绘制图像附加到 Gmail?

    我正在尝试将 gridview 中的图像附加到 gmail 或 facebook 但是每当我尝试附加应用程序时就会崩溃 并且我收到以下带有空指针异常的错误 以下是我使用 gridview 图像选择的代码 有人可以帮忙吗 public cla
  • VSCodium - Python 模块没有绿色语法

    最近 我正在尝试从 VSCode 迁移到 VSCodium 我发现一个问题是VSCodium中没有模块的绿色着色 如下图所示 左 VSCode 具有绿色语法 右 VSCodium 没有绿色语法 我在网上看到一些其他的截图 他们的 VSCod
  • java.time.ZonedDateTime.parse 和 iso8601?

    为什么 JDK8 DateTime 库似乎无法解析有效的 iso8601 日期时间字符串 它因表示为 01 而不是 01 00 的时区偏移而阻塞 这有效 java time ZonedDateTime parse 2015 08 18T00
  • 在 Thymeleaf 方言处理器中访问 HttpServletRequest 和 HttpServletResponse

    我正在尝试创建一个执行 ServletDispatcher include 的 Thymeleaf 方言处理器 我扩展了 AbstractElementTagProcessor 并重写了 doProcess 方法 相关代码片段是 Overr
  • 从中间件调用控制器的操作方法

    我的中间件类位于不同的类库项目中 控制器位于不同的项目中 我正在尝试做的事情是 如果不满足特定条件 则从中间件重定向到自定义控制器 操作方法 但是 我无法使用 Response Redirect 方法来做到这一点 我怎样才能在中间件类中做到
  • 无法在 Go 代码中获取 AWS EKS 集群的 kubeconfig

    我已经创建了一个 AWS EKS 集群 为了获取它的 kubeconfig 我通常运行aws eks update kubeconfig name cluster name region us west 2使用外壳 但是 我现在希望在 Go
  • Docker-compose 命名挂载卷

    为了跟踪 docker compose 使用的卷 我想使用命名卷 这对于 正常 卷非常有效 例如 version 2 services example app volume named vol dir in container volume
  • 如果用户未使用 FastAPI-Login 包登录,则重定向到登录页面

    我想在用户未登录时将他们重定向到登录页面 这是我的代码 from fastapi import Depends FastAPI HTTPException status Body Request from fastapi encoders
  • AS3 的 Tween 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人可以推荐我一个好的 AS3 Tween 库吗 用于 Flash 而不是 Flex 吐温精简版 ht
  • 从服务中删除持续通知

    我有一项在启动时创建通知的服务 然后 ondestroy 我希望将其删除 我只是使用 cancel NOTIFICATION ID 当它是正常通知时它效果很好 但当我使用正在进行的事件时它不会取消它 我确实读到过一些关于如果 android
  • UILabel字体:粗体和斜体[重复]

    这个问题在这里已经有答案了 可能的重复 iPhone iPad的UILabel如何设置粗体和斜体 https stackoverflow com questions 4713236 how do i set bold and italic
  • 流音频中的降噪和压缩

    希望你能帮忙 我正在从麦克风录制音频并通过网络实时传输 样本的质量为 11025hz 8 位 单声道 虽然有一点延迟 1秒 但效果很好 我需要帮助的是我现在正在尝试实现降噪和压缩 以使音频更安静并使用更少的带宽 音频样本存储在 C 的 by
  • 计算给定记录的跳过值以进行排序分页

    我正在尝试使用 php 驱动程序计算 mongo db 集合中给定记录的跳过值 因此 获取给定的记录 找出该记录在整个集合中的索引 这可能吗 目前 我正在选择所有记录并手动对结果数组进行索引 这称为 前向分页 这是一个概念 您可以在使用 排