代码之家  ›  专栏  ›  技术社区  ›  Johan

用spring数据推送磁通与无功mongodb

  •  0
  • Johan  · 技术社区  · 7 年前

    我使用的是SpringBoot2.0.2,我想插入 Flux 在mongodb的文档中使用spring数据的数组中使用 ReactiveMongoOperations . 例如(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 不是使用 Flux.just(..) 在实际代码中)。

    虽然这样做不会产生我想要的结果:

    { "_id" : "myId", "myArray" : [ { "array" : [ { "data" : "A" }, { "data" : "B" } ], "_class" : "reactor.core.publisher.FluxArray" } ] }
    

    我希望结果是:

    { "_id" : "myId", "myArray" : [ { "data" : "A" }, { "data" : "B" } ] }
    

    也就是说,spring数据序列化了 通量 而不是 通量 本身。此示例生成正确的结果:

    mongo.upsert(query(where("_id").isEqualTo("myId")),
                            Update().push("myArray").each(Something("A"), Something("B")),
                            "collection")
    

    我怎样才能做到 无阻塞 ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   mp911de    7 年前

    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) 可能是更合适的选择。