Push Flux с использованием данных Spring с Reactive MongoDB - PullRequest
0 голосов
/ 30 мая 2018

Я использую Spring Boot 2.0.2, и я хотел бы вставить содержимое Flux в массив документа в MongoDB, используя Spring Data, его реактивную поддержку mongodb, используя ReactiveMongoOperations .Например (код Котлина):

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сериализует содержимое (элементы) в Flux, а не в Flux.Этот пример дает правильный результат:

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

Как мне добиться этого без блокировки ?

1 Ответ

0 голосов
/ 03 июня 2018

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) может быть более подходящим выбором.

...