我在尝试实现以下目标时遇到了问题:
我希望有一个具有“无限”滚动功能的页面,并且所有结果都会被某些属性排序。代码当前的工作方式是,它放置查询,对结果进行排序并显示它们。问题是,一旦用户到达页面底部并放置了新查询,此查询的结果将按其自己的上下文进行排序。也就是说,如果您总共有100个结果,并且第一个查询仅显示50个,那么它们将被排序。但是下一个查询(对于下一个50)只根据这50个结果对结果进行排序,而不是基于100个(总结果)。
那么,我是否必须立即获取所有结果,对它们进行排序,然后对它们应用一些分页逻辑,或者MongoDB实际上有一种方法可以实现无限滚动(AJAX请求)并对结果进行排序? / p>
答案 0 :(得分:2)
使用MongoDB有几种方法可以做到这一点。您可以使用.skip()
和.limit()
命令(此处记录:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-CursorMethods)将分页应用于查询。
或者,您可以在查询中添加一个子句,如:{sorted_field : {$gt : <value from last record>}}
。换句话说,过滤掉查询的匹配,该查询的排序值小于当前结果页面中最后得到的项目的排序值。例如,如果结果的第1页返回文档A到D,那么要检索下一页2,您可以使用附加过滤器x > D
重复相同的查询。
答案 1 :(得分:1)
让我先说明我没有使用MongoDB的经验(虽然我知道它是NoSQL数据库)。
然而,这个问题在某种程度上是一般的数据库(你可能会得到更多的回应标记它)。我已经使用Cassandra(另一个,albiet完全不同的NoSQL数据库)实现了这样的功能,但是同样的原则适用。
使用上次检索到的记录的sorted-by属性,并在数据库中基于它进行范围搜索。因此,假设您的数据库包含以下字母集:
A
B
C
D
E
F
G
..并且您一次检索2个字母,首先检索A, B
。当需要更多记录时,您将使用B对数据库中的字母集进行范围搜索。用简单的英语,这将是:
获取
B
后出现的字母,将结果限制为2
简要介绍一下MongoDB教程,看起来你有conditional operators来帮助你实现它。