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

Posted

技术标签:

【中文标题】以反应方式将嵌套记录插入到 mongo【英文标题】:Insert nested records to mongo in reactive fashion 【发布时间】:2019-03-22 13:35:15 【问题描述】:

试图围绕反应堆模型和管道,我想向 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 还是有更好的方法?

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

谢谢

【问题讨论】:

【参考方案1】:

原来我已经很接近正确的解决方案了

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的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个对象插入到mongo数组中的另一个对象中

在bigquery中以编程方式更新/插入数据

如何使用 bigquery 流向现有记录插入嵌套数据

在 Mongo 集合中更新数组中的一条记录

在 bigquery 中以编程方式更新/插入数据

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中