以反应方式将嵌套记录插入 mongo
Insert nested records to mongo in reactive fashion
为了深入了解反应堆模型和管道,我想在 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: state should be: open
当然,我可以通过分别为每个用户插入来绕过这个问题,我不知道为什么会引发此异常,也感谢有关此问题的回答
我的 main 问题是如何以最反应的方式编写它,我是否需要阻塞以便在插入后填充实体 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-reactive @EnableReactiveMongoRepositories
感谢
事实证明我非常接近正确的解决方案
Flux.just(u1, u2, u3).flatMap(u -> reactiveMongoTemplate.insert(u)).subscribe(u -> {
Flux.range(0,10).flatMap(i -> reactiveMongoTemplate.insert(new Offer(u))).subscribe();
});
现在代码是真正反应式的,也可以在数据库中看到(记录以随机顺序插入)
为了深入了解反应堆模型和管道,我想在 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: state should be: open
当然,我可以通过分别为每个用户插入来绕过这个问题,我不知道为什么会引发此异常,也感谢有关此问题的回答
我的 main 问题是如何以最反应的方式编写它,我是否需要阻塞以便在插入后填充实体 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-reactive @EnableReactiveMongoRepositories
感谢
事实证明我非常接近正确的解决方案
Flux.just(u1, u2, u3).flatMap(u -> reactiveMongoTemplate.insert(u)).subscribe(u -> {
Flux.range(0,10).flatMap(i -> reactiveMongoTemplate.insert(new Offer(u))).subscribe();
});
现在代码是真正反应式的,也可以在数据库中看到(记录以随机顺序插入)