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

Garbit

我正在尝试使用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看到了“一个”值在那个值,然后只排除那个。

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

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

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

但是,如果您想20在任何阶段“跳转”到页面或类似操作,则此方法不适合您。由于没有其他合理的方法来“计算”这一点,因此您只能使用“页码”来做到这一点的传统.skip().limit()方法。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

由于SQL中的分页,子记录被跳过

来自分类Dev

由于SQL中的分页,子记录被跳过

来自分类Dev

如何使用具有不同跳过和限制值的相同查询对搜索结果进行分页

来自分类Dev

BigQuery跳过,进行数据网格分页

来自分类Dev

如何计算给定间隔的记录?

来自分类Dev

在do while循环中跳过给定值时进行ac迭代

来自分类Dev

在Rails中基于计算值进行排序并按分页问题进行排序

来自分类Dev

每页动态记录以进行Ajax分页

来自分类Dev

如何对记录进行分组和分页?

来自分类Dev

每页动态记录以进行Ajax分页

来自分类Dev

计算给定列的值之和

来自分类Dev

计算行数并与给定数进行比较

来自分类Dev

AngularJS根据给定的公式进行计算

来自分类Dev

计算值= 1的记录总数

来自分类Dev

检索列中给定值之间的记录

来自分类Dev

如何对使用UI Bootstrap分页进行分页的AngularJS中的所有记录进行排序和筛选

来自分类Dev

MongoDB-使用分数排序对记录进行分页的问题

来自分类Dev

Spring Batch-跳过记录进行中

来自分类Dev

计算pandas中给定值的平均频率

来自分类Dev

递归算法计算小于给定值的节点

来自分类Dev

使用maple计算值以进行mod计算

来自分类Dev

使用列表值进行计算

来自分类Dev

对值数组进行计算-Python

来自分类Dev

将给定值与多维数组进行比较

来自分类Dev

PostgreSQL-如何找到记录与行匹配的记录,该记录的值大于给定值?

来自分类Dev

MySQL-要针对同一列中的所有记录进行计算的列的最大值

来自分类Dev

MySQL-要针对同一列中的所有记录进行计算的列的最大值

来自分类Dev

计算数字序列,同时跳过缺失值

来自分类Dev

SQL:计算每条记录的列值

Related 相关文章

热门标签

归档