我正在尝试使用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
和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”的值而不是“小于或等于”
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