使用Spring Data MongoDB ReactiveMongoRepository切片投影?

时间:2018-06-04 19:04:14

标签: spring mongodb spring-boot kotlin spring-data-mongodb

我有一个名为myCollection的集合,其中包含具有以下格式的文档:

{
    "_id" : "1",
    "myArray" : [ { x: 1, y: "a" }, { x: 2, y: "b" }, { x: 3, y: "c" }, { x: 4, y: "d" }, { x: 5, y: "e" }]
}

我想要做的是构建一个查询,以myArray作为投影返回slice个元素。

即。假设我的文档定义如下:

@Document(collection = "myCollection")
data class MyDocument(@Id val myId : String, val myArray : List<MyItem>)

其中MyItem的定义如下:

data class MyItem(val x: Int, val y: String)

现在我想创建一个函数,在给定具有特定id的MyItem的特定偏移量和项目数(或“页面”)的情况下返回MyDocument列表。

这是我尝试过的(使用projections):

data class MyArrayProjection(val myArray: List<MyItem>)

interface MyRepository : ReactiveMongoRepository<MyDocument, String> {             
    fun findByMyId(myId: String, pageable: Pageable): Flux<MyArrayProjection>
}

使用例如

调用此功能时我想看到的内容
myRepository.findByMyId("1", PageRequest.of(1, 2))

是它返回包含FluxMyItem(x=3, y="c")的{​​{1}},但它是空的。

生成的MongoDB查询如下所示:

MyItem(x=4, y="d")

我怀疑发生的事情是{ "find" : "myCollection", "filter" : { "_id" : "1" }, "projection" : { "myArray" : 1 }, "skip" : 2, "limit" : 2, "batchSize" : 256 } 实例在聚合(Pageable)而不在“{1}}字段”内部运行,这就是为什么我怀疑我想以某种方式改为使用$slice运算符。

我怎样才能做到这一点?如果使用ReactiveMongoRepository无效,那么我可以使用ReactiveMongoOperations

1 个答案:

答案 0 :(得分:0)

我设法通过改变来解决这个问题:

interface MyRepository : ReactiveMongoRepository<MyDocument, String> {             
    fun findByMyId(myId: String, pageable: Pageable): Flux<MyArrayProjection>
}

为:

interface MyRepository : ReactiveMongoRepository<MyDocument, String> {             
    @Query(value = "{ '_id' : ?0 }", fields = "{ 'myArray': { '\$slice': ?1 } }")
    fun findByMyId(myId: String, slice: Array<Int>): Flux<MyArrayProjection>
}

然后使用:

调用它
myRepository.findByMyId("1", arrayOf(1, 2))