我使用的是Spring Boot2.0.2,我想使用Spring Data将Flux
的内容插入到MongoDB文档的数组中,并使用ReactiveMongoOperations实现对mongodb的响应式支持。例如(Kotlin代码):
val mongo : ReactiveMongoOperations = ...
data class Something(val data: String)
val flux = Flux.just(Something("A"), Something("B"))
mongo.upsert(query(where("_id").isEqualTo("myId")),
Update().push("myArray").each(flux),
"collection")
(请注意,这只是一个示例,并不是在实际代码中使用Flux.just(..)
生成flux
)。
虽然这是可行的,但它并没有产生我想要的结果:
{ "_id" : "myId", "myArray" : [ { "array" : [ { "data" : "A" }, { "data" : "B" } ], "_class" : "reactor.core.publisher.FluxArray" } ] }
我希望结果是:
{ "_id" : "myId", "myArray" : [ { "data" : "A" }, { "data" : "B" } ] }
也就是说,Spring Data序列化Flux
中的内容(元素),而不是Flux
本身。此示例产生正确的结果:
mongo.upsert(query(where("_id").isEqualTo("myId")),
Update().push("myArray").each(Something("A"), Something("B")),
"collection")
我怎样才能在不阻塞的情况下实现这一点?
发布于 2018-06-04 02:52:32
TL;DR
您需要预先收集项目并对项目集合执行$push
操作。
解释
您不能将反应式包装器类型用作MongoDB查询的值,因为它们需要预先解析为值。您可以通过应用collectList()
和flatMap()
运算符来实现您想要的结果:
val flux: Flux<Something>
flux.collectList()
.flatMap { mongo.upsert(query(where("_id").isEqualTo("myId")),
Update().push("myArray").each(it),
"collection") }
如果元素的数量超过了合理的限制,那么buffer(n)
可能是更合适的选择。
https://stackoverflow.com/questions/50607034
复制相似问题