首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过Reactive MongoDB使用弹簧数据推送通量

通过Reactive MongoDB使用弹簧数据推送通量
EN

Stack Overflow用户
提问于 2018-05-30 22:17:51
回答 1查看 665关注 0票数 0

我使用的是Spring Boot2.0.2,我想使用Spring Data将Flux的内容插入到MongoDB文档的数组中,并使用ReactiveMongoOperations实现对mongodb的响应式支持。例如(Kotlin代码):

代码语言:javascript
复制
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 )。

虽然这是可行的,但它并没有产生我想要的结果:

代码语言:javascript
复制
{ "_id" : "myId", "myArray" : [ { "array" : [ { "data" : "A" }, { "data" : "B" } ], "_class" : "reactor.core.publisher.FluxArray" } ] }

我希望结果是:

代码语言:javascript
复制
{ "_id" : "myId", "myArray" : [ { "data" : "A" }, { "data" : "B" } ] }

也就是说,Spring Data序列化Flux中的内容(元素),而不是Flux本身。此示例产生正确的结果:

代码语言:javascript
复制
mongo.upsert(query(where("_id").isEqualTo("myId")),
                        Update().push("myArray").each(Something("A"), Something("B")),
                        "collection")

我怎样才能在不阻塞的情况下实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 02:52:32

TL;DR

您需要预先收集项目并对项目集合执行$push操作。

解释

您不能将反应式包装器类型用作MongoDB查询的值,因为它们需要预先解析为值。您可以通过应用collectList()flatMap()运算符来实现您想要的结果:

代码语言:javascript
复制
val flux: Flux<Something>

flux.collectList()
    .flatMap { mongo.upsert(query(where("_id").isEqualTo("myId")),
                    Update().push("myArray").each(it),
                    "collection")  }

如果元素的数量超过了合理的限制,那么buffer(n)可能是更合适的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50607034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档