【问题标题】:Spring data mongodb query skip() works not how it should.Spring data mongodb query skip() 不是它应该的工作方式。
【发布时间】:2014-01-12 13:40:31
【问题描述】:

我发现使用 mongoOperations 的查询中的 skip() 行为很有趣。

我有这个代码:

if (question.getCategory() == "" && question.getDifficulty() == 0 && question.getNumberOfCorrectAnswers() == 0) 
        return mongoOperations.find(new Query(Criteria.where("question").regex(questionPattern, "i"))
        .limit(getLimit()).skip(getSkip()), Question.class);

我在我的搜索方法中使用它。我想做一个分页。例如,将结果限制为 10 个并跳过前 5 个。

limit() 工作得很好,但是当它得到 1 的值时,skip() 会显示集合中的第一个文档。 limit() 默认为 0,不会缩短范围。

我检查了 mongodb shell,skip(1) 正在查看从第二个开始的文档。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您是否尝试过调试您的代码?我怀疑您甚至没有访问 if 子句。 question.getCategory() == "" 为假(身份)。应该是"".equals(question.getCategory())
  • 我找到了真正的问题。我使用 angularJS,并且我的 ng-models 以某种神秘的方式发生碰撞,并且从由 2 个不同模型绑定的 2 个输入中,第一个值进入第二个范围,而不是应该的第一个范围。
  • 您的查询中似乎缺少sort?如果不使用特定的排序顺序,skip 不会为您的分页返回可预测的结果。
  • 根据 Mongo 文档,将 skip() 放在 limit() 之前可能很重要 - docs.mongodb.org/manual/reference/method/cursor.skip

标签: java spring mongodb spring-mvc spring-data


【解决方案1】:

你可以试试这个吗:

Criteria criteria = Criteria.where("question").regex(questionPattern, "i");
Query query = Query.query(criteria);
query.limit(getLimit());
query.skip(getSkip());
return mongoOperations.find(query, Question.class);

【讨论】:

  • 它给出了同样的效果。我在集合中有 6 个文档。当我跳过 2 时,它会显示前 2 个,而不是从 3 到 6。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多