以响应方式将嵌套记录插入mongo

时间:2018-10-17 19:23:46

标签: spring-boot spring-data-mongodb flux project-reactor

试图绕过反应堆模型和管道,我想在mongo中插入几个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:状态应为:打开

我当然可以通过为每个用户分别插入来绕过此操作,我不知道为什么会引发此异常,并且感谢您对此问题的解答

我的主要问题是如何以最具反应性的方式编写它,我是否应该阻塞才能在插入后填充实体Id或有更好的方法? / p>

UserOffer的确切实现并不重要,它可以是任何简单的记录,但在这里是

@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-active @EnableReactiveMongoRepositories

Thx

1 个答案:

答案 0 :(得分:0)

结果证明我已经接近正确的解决方案

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

现在代码是真正的反应性代码,它也可以在数据库中看到(记录以随机顺序插入)