如何在使用Spring数据MongoDB对列表进行分页时处理中间添加?
我正在尝试在SpringDataMongoDB中创建后端。我有以下有效的代码,并且通过使用MongoRepository类扩展我的repo使用了内置方法:如何在使用Spring数据MongoDB对列表进行分页时处理中间添加?,spring,mongodb,pagination,spring-data,spring-data-mongodb,Spring,Mongodb,Pagination,Spring Data,Spring Data Mongodb,我正在尝试在SpringDataMongoDB中创建后端。我有以下有效的代码,并且通过使用MongoRepository类扩展我的repo使用了内置方法: @RequestMapping(value="/nextpost", method=RequestMethod.GET) public List getNextPosts(@RequestParam int next) { Pageable pageable = new PageRequest(next, 5, new Sor
@RequestMapping(value="/nextpost", method=RequestMethod.GET)
public List getNextPosts(@RequestParam int next) {
Pageable pageable = new PageRequest(next, 5, new Sort(new Sort.Order(Direction.DESC, "id")));
page = repo.findAll(pageable);
return page.getContent();
}
上述代码将根据插入“next”变量的页码返回页面
然而,我的android前端允许从数据库中添加和删除内容,这会导致这种分页方法出现问题。让我们举一个例子:
如果使用分页来确定项目列表并处理所有项目,另一种方法是跟踪已处理项目的标识符。在您的特定场景中,您将能够检测到项目已被处理,并继续下一页。当然,只有当您读取和处理列表的速度比其他人在后端处理列表的速度快时,这才有意义。另一种解决方案可能是为每个条目在数据库中存储一个插入时间戳。这使您能够创建确定性分页查询: 初始化分页(查询第一页)的那一刻,您就限制项的插入时间戳小于now()。您必须将now()保存为分页时间戳,以便将来查询更多页面。由于新添加的项目都会获得大于分页时间戳的插入时间戳,因此这些项目不会影响现有分页
请记住,在通过刷新分页时间映射重新初始化分页之前,不会显示新项目。但是,您可以简单地通过计算插入时间戳大于分页时间戳的项目数量来检查是否存在新项目,在本例中,您可以显示刷新按钮或类似的内容。我认为我的解决方案与您在此处所描述的接近。我必须在android端通过让android保存从我的服务器检索到的最后一个项目来管理这一点。当我需要进入下一页时,我必须将最后一个项目的objectID发送回服务器,然后服务器将发送回位于最后一个项目objectID之后的项目。Spring数据方法不适合动态数据库,而页面内置功能似乎只处理静态数据库,这看起来很奇怪。如果您不能修改底层数据库模式,我提出的解决方案将不起作用。但是,如果项目id只是递增的数字,则可以使用max id而不是insert时间戳。您可以在开始分页之前查询max ID,然后将分页查询限制为小于max ID的ID,假设新添加项的ID大于此max ID。