findBy查询没有返回正确的页面信息

时间:2015-02-13 16:42:45

标签: spring-data-mongodb

我有一个由以下结构组成的Person集合

{ "_id" : ObjectId("54ddd6795218e7964fa9086c"), "_class" : "uk.gov.gsi.hmpo.belt.domain.person.Person", "imagesMatch" : true, "matchResult" : { "_id" : null, "score" : 1234, "matchStatus" : "matched", "confirmedMatchStatus" : "notChecked" }, "earlierImage" : DBRef("image", ObjectId("54ddd6795218e7964fa9086b")), "laterImage" : DBRef("image", ObjectId("54ddd67a5218e7964fa908a9")), "tag" : DBRef("tag", ObjectId("54ddd6795218e7964fa90842")) } 请注意,“标记”是DBRef。

我有一个Spring Data finder,如下所示:

Page<Person> findByMatchResultNotNullAndTagId(@Param("tagId") String tagId, Pageable page);

执行此代码时,查找查询如下所示:

{ matchResult: { $ne: null }, tag: { $ref: "tag", $id: ObjectId('54ddd6795218e7964fa90842') } } sort: {} projection: {} skip: 0 limit: 1

哪个好,我收到一个人的回合(限制= 1)。但是页面详细信息不正确。我收藏了31个人,所以我应该有31页。我得到的是以下内容:

"page" : {
  "size" : 1,
  "totalElements" : 0,
  "totalPages" : 0,
  "number" : 0
 }

计数查询如下所示:

{ count: "person", query: { matchResult: { $ne: null }, tag.id: "54ddd6795218e7964fa90842" } }

与上面的等效查找查询相比,那个tag.id看起来不正确。

我发现如果我向org.springframework.data.mongodb.core.MongoOperations添加一个新方法:

public interface MongoOperations {

    public long count(Query query, Class<?> entityClass, String collectionName);
}

然后重新jig AbstractMongoQuery.execute(Query query)使用该方法而不是使用entityClass参数的类似方法,然后我得到正确的分页结果。

问题:我是做错了还是Spring Data Mongo中的错误?

修改

从Christoph获取灵感我在Git https://github.com/tedp/Spring-Data-Test

上添加了以下测试代码

2 个答案:

答案 0 :(得分:0)

返回的Page中包含的信息取决于执行的查询。假设您的集合中总共有31个元素,只有少数元素,甚至只有一个元素可能通过引用id: 54ddd6795218e7964fa90842标记来匹配给定条件。因此,您只能获得与查询匹配的总元素,而不是集合中的总元素。

答案 1 :(得分:0)

正如Christoph所指出的那样,这个错误实际上是固定的DATAMONGO-1120。我需要覆盖spring数据版本以使用1.6.2.RELEASE直到Spring Boot的下一次迭代,其中可能Spring Data将被提升到至少1.6.2.RELEASE。