2012-04-30 60 views
2
我有努力实现以下问题

MongoDB的无限滚动排序结果

我想有“无限”的滚动功能,所有提取到的某些属性进行排序结果的页面。代码当前工作的方式是,它放置查询,排序结果并显示它们。问题是,一旦用户到达页面的底部并且放置了新的查询,则来自该查询的结果被排序,但是在它自己的上下文中。也就是说,如果总共有100个结果,并且第一个查询仅显示50个结果,那么它们将被排序。但是下一个查询(对于下一个50)只根据这50个结果对结果进行排序,而不是基于100(总结果)。

那么,我必须一次获取所有结果,对它们进行排序,然后对它们应用一些分页逻辑,或者有一种方法让MongoDB实际上有无限滚动(AJAX请求)和排序应用于结果?

回答

1

让我通过说我没有使用MongoDB的经验(尽管我知道它是一个NoSQL数据库)。

但是,这个问题有点像一个普通的数据库(你可能会得到更多的回复标签)。我已经使用Cassandra(另一个,albiet完全不同的NoSQL数据库)实现了这样的功能,但是同样的原则适用。

使用上次检索记录的排序依据属性,并在数据库中基于该属性进行范围搜索。因此,假设您的数据库包含了以下一组字母:

A 
B 
C 
D 
E 
F 
G 

..和你在同一时间获取2个字母,你首先检索A, B。当需要更多记录时,您将使用B对数据库中的一组字母进行范围搜索。用简单的英语,这将是这样的:

获取B之后出现的字母,结果限制在2

从MongoDB的教程简单的介绍一下,它看起来像你有conditional operators到帮助你实现这一点。

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重复相同的查询。