当前位置: 首页 > 面试题库 >

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

高慈
2023-03-14
问题内容

我正在尝试使用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
});

现在,这些lastVallastSeen存储在诸如“会话变量”之类的东西中,然后就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”的值而不是“小于或等于”
the的值,lastVal并且因为只_id看到了“一个” 值在那个值,然后只排除那个。

当然,这将使用与上面相同的html" target="_blank">代码产生下一页:

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

通常,这是通过结果“转发页面”的最有效方式,对于“分页”结果的有效分页特别有用。

但是,如果您想20在任何阶段“跳转”到页面或类似的操作,则不适合您。你被卡住的传统.skip().limit()方法能够通过“页码”要做到这一点,因为那里是“计算”没有其他合理的方式。

因此,这完全取决于您的应用程序如何实现“分页”以及您可以使用什么。在.skip().limit()做法受到“退出”,可以通过在这里使用的方式来避免的性能。

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



 类似资料:
  • 我想用IntelliJ IDEA2018.3.4将控制台输出记录到一个文件中。 我找到了这个答案,但是,我需要的是日志文件来记录多次运行,相反,最后一次运行会覆盖日志文件。 根据官方文档,我应该通过勾选“run/Debug Configurations”中的“Skip Content”复选框来获得连续日志记录,但我仍然只能获得日志中的最后一次运行。 我这样做对吗?还是有别的办法?

  • 问题内容: 如何在数据库中选择一些记录,从而跳过MS Access中的行数。在MySQL中是。火鸟是等。 在Google上根本没有运气=( 问题答案: 如果您知道要跳过多少条记录,则可以执行以下操作: 然后,您可以排除不需要的记录。 如果您随后知道要返回的记录总数,则可以执行以下操作:

  • 我在声纳中发现了一条规则,它说: 与其他中间流操作的一个关键区别是,为了优化目的,流实现可以跳过对< code>peek()的调用。这可能会导致< code>peek()仅针对流中的某些元素或不针对流中的任何元素被意外调用。 另外,Javadoc中提到了它,它说: 此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这种情况下可以跳过吗?和调试有关吗?

  • 问题内容: 我有一个SQL Server 2008数据库和一个asp.net前端。 当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。 我的想法是为记录创建一列,并在用户拉出该记录时将其设置为true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑为止。 但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为,表示其他人无法对其进行编辑,对吗? 如何实现某

  • 问题内容: 说我有一个像这样的数组: 如何计算具有给定值的数字(在示例中为空白)? 而且有效吗?(大约十二个数组,每个数组包含数百个元素)此示例超时(超过30秒): 在这种情况下,空白元素的数量为3。 问题答案: 如何使用array_count _values来获得一个为您计算一切的数组?

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f