Вставьте вложенные записи в монго реактивным способом - PullRequest
0 голосов
/ 17 октября 2018

Пытаясь обернуть голову вокруг модели реактора и трубопровода, я хочу вставить в монго пару Users, затем для каждого пользователя я хотел бы вставить несколько (10) Offers

Моя текущая реализация включает в себя вставку 3 пользователей в базу данных, блокирование и вставку предложений (только для 1 пользователя) несколько назад, например так:

Flux.just(u1, u2, u3).flatMap(u -> reactiveMongoTemplate.insert(u)).blockLast();
Arrays.asList(u1, u2, u3).forEach(user -> {
        IntStream.range(0,10).forEach(i -> reactiveMongoTemplate.insert(new Offer(user)).subscribe());
    });

Первая строка работает нормально, но я получаю следующееисключение

java.lang.IllegalStateException: состояние должно быть: open

Конечно, я могу обойти это, вставляя для каждого пользователя отдельно, я не знаю, почему этоВозникла исключительная ситуация, и я также благодарен за ответ по этому вопросу

Мой основной вопрос в том, как написать его наиболее оперативно, если мне нужно заблокировать его для заполнения сущности Id после вставки или есть лучший способ?

Точная реализация User и Offer на самом деле не имеет значения, это могут быть любые простые записи, но здесь они

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "users")
public class User extends BaseEntity {

    private String name;
}

...

@Data
@Document(collection = "offers")
public class Offer extends BaseEntity {

    private String title;

    @JsonSerialize(using = ToStringSerializer.class)
    private ObjectId user;

    public Offer(){
        this.title = "some title " + new Random().nextInt(10);
    }

    public Offer(User user){
        this();
        this.user = new ObjectId(user.getId());
    }

    public void setUser(String userId) {
        this.user = new ObjectId(userId);
    }
}

reactiveMongoTemplate от spring-boot-starter-data-mongodb-реактивный @EnableReactiveMongoRepositories

Thx

1 Ответ

0 голосов
/ 18 октября 2018

Оказалось, что я был довольно близок к правильному решению

Flux.just(u1, u2, u3).flatMap(u -> reactiveMongoTemplate.insert(u)).subscribe(u -> {
    Flux.range(0,10).flatMap(i -> reactiveMongoTemplate.insert(new Offer(u))).subscribe();
});

теперь код действительно реагирует и его можно увидеть и в базе данных (записи вставляются в случайном порядке)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...