Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用Spring数据MongoDB对列表进行分页时处理中间添加?_Spring_Mongodb_Pagination_Spring Data_Spring Data Mongodb - Fatal编程技术网

如何在使用Spring数据MongoDB对列表进行分页时处理中间添加?

如何在使用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

我正在尝试在SpringDataMongoDB中创建后端。我有以下有效的代码,并且通过使用MongoRepository类扩展我的repo使用了内置方法:

  @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前端允许从数据库中添加和删除内容,这会导致这种分页方法出现问题。让我们举一个例子:

  • 当我的android前端启动时,它会按 使用next=0调用“getNextPosts”
  • 我的android前端还跟踪它所在的页面和 当用户希望看到更多项目时,将其递增
  • 现在,我们立即再添加5项

  • 当我向上滑动取回接下来的5个项目时,它调用 “getNextPosts”方法传递“下一页”值=1。应用程序 将加载 相同应用程序启动时最初显示的5个项目,因为我添加的5个“新”项目只是将5个“旧”项目向下推 数据库

  • 因此,在应用程序上,我们看到15个项目,包括:

    5“新”+5“旧”+5“旧”

    因此,如果我给android ListView上的所有项目编号,我会看到:

    十五

    十四,

    十三,

    十二,

    十一,

    //以上为新增项目

    十,

    九,

    八,

    七,

    六,

    //以上为第0页上的原始项目

    十,

    九,

    八,

    七,

    六,

    //以上内容仍然是原始项目,但现在我们在第1页

    是否有人知道如何解决此问题,以便在我刷起时,项目将是:

    十五

    十四,

    十三,

    十二,

    十一,

    //以上为新增项目

    十,

    九,

    八,

    七,

    六,

    五,

    //以上为第0页上的原始项目

    四,

    三,

    二,

    一,

    0

    //上述内容见第1页

    tl;博士 这就是野兽的本性。Spring数据中的分页定义为在查询时检索结果集的一部分。特别是对于远程通信,这种无状态状态通常是保持状态、保持连接开放、可伸缩性等之间的最佳折衷

    细节 避免这种情况的唯一方法是在第一次访问时捕获数据库的状态,并仅处理该状态。实际上,您可以通过检索所有项目并在本地翻页数据来构建它

    当然,几乎没有人这样做,因为对于更大的数据量,它很容易失控。此外,这还会带来其他问题,比如:您实际上希望看到同时引入的项目是什么时候?因此,为列表分页时“正确内容”的定义并不明确

    缓解战略 如果适用于您的场景,您可以尝试应用排序,以保证在最后添加新项目,从而基本上使其成为仅附加的列表。不过,这会自然地将最近的项目排在最后,这与经常需要的排序相反


    如果使用分页来确定项目列表并处理所有项目,另一种方法是跟踪已处理项目的标识符。在您的特定场景中,您将能够检测到项目已被处理,并继续下一页。当然,只有当您读取和处理列表的速度比其他人在后端处理列表的速度快时,这才有意义。

    另一种解决方案可能是为每个条目在数据库中存储一个插入时间戳。这使您能够创建确定性分页查询:

    初始化分页(查询第一页)的那一刻,您就限制项的插入时间戳小于now()。您必须将now()保存为分页时间戳,以便将来查询更多页面。由于新添加的项目都会获得大于分页时间戳的插入时间戳,因此这些项目不会影响现有分页


    请记住,在通过刷新分页时间映射重新初始化分页之前,不会显示新项目。但是,您可以简单地通过计算插入时间戳大于分页时间戳的项目数量来检查是否存在新项目,在本例中,您可以显示刷新按钮或类似的内容。

    我认为我的解决方案与您在此处所描述的接近。我必须在android端通过让android保存从我的服务器检索到的最后一个项目来管理这一点。当我需要进入下一页时,我必须将最后一个项目的objectID发送回服务器,然后服务器将发送回位于最后一个项目objectID之后的项目。Spring数据方法不适合动态数据库,而页面内置功能似乎只处理静态数据库,这看起来很奇怪。如果您不能修改底层数据库模式,我提出的解决方案将不起作用。但是,如果项目id只是递增的数字,则可以使用max id而不是insert时间戳。您可以在开始分页之前查询max ID,然后将分页查询限制为小于max ID的ID,假设新添加项的ID大于此max ID。