当前位置: 首页 > 知识库问答 >
问题:

使用Web Flux和Mongo DB保存多个记录

印晋
2023-03-14

我正在做一个使用Spring web Flux和mongo DB的项目,我对反应编程和WebFlux非常陌生。

我有使用一个服务保存到3个集合的场景。对于每个集合,im使用序列生成id,然后保存它们。我有FieldMaster,上面有列表,每个字段信息都有列表。我需要保存FieldMaster、FileInfo和FieldOption。下面是我正在使用的代码。代码仅在调试模式下运行时才起作用,否则会在行以下阻塞

    return fieldmaster.flatMap(fm -> {
        return sequencesCollection.getNextSequence(FIELDMASTER).flatMap(seqVal -> {
            LOGGER.info("Generated Sequence value :" + seqVal.getSeqValue());
            fm.setId(Integer.parseInt(seqVal.getSeqValue()));
            List<FieldInfo> fieldInfo = fm.getFieldInfo();
            fieldInfo.forEach(field -> {
                // saving Field Goes Here
                Integer field_seq_id = Integer.parseInt(sequencesCollection.getNextSequence(FIELDINFO).block().getSeqValue()); // stops execution at this line
                LOGGER.info("Generated Sequence value  Field Sequence:" + field_seq_id);
                field.setId(field_seq_id);
                field.setMasterFieldRefId(fm.getId());
                mongoTemplate.save(field).block();
                LOGGER.info("Field Details Saved");
                List<FieldOption> fieldOption = field.getFieldOptions();
                fieldOption.forEach(option -> {
                    // saving Field Option Goes Here
                    Integer opt_seq_id = Integer.parseInt(sequencesCollection.getNextSequence(FIELDOPTION).block().getSeqValue());
                    LOGGER.info("Generated Sequence value Options Sequence:" + opt_seq_id);
                    option.setId(opt_seq_id);
                    option.setFieldRefId(field_seq_id);
                    mongoTemplate.save(option).log().block();
                    LOGGER.info("Field Option Details Saved");
                });
            });
            return mongoTemplate.save(fm).log();
        });
    });

}

共有1个答案

邴英毅
2023-03-14

首先,在反应编程中是不好用的。块,因为你把非阻塞代码变成了阻塞。如果您想从一个流中获取并保存在3个流中,您可以这样做。出于性能目的,有许多不同的方法可以实现,但这取决于数据量。这里有一个使用简单数据和concat运算符的示例,但甚至还有zip和merge。这取决于你的需要。

  public void run(String... args) throws Exception {
    Flux<Integer> dbData = Flux.range(0, 10);

    dbData.flatMap(integer -> Flux.concat(saveAllInFirstCollection(integer), saveAllInSecondCollection(integer), saveAllInThirdCollection(integer))).subscribe();
}

Flux<Integer> saveAllInFirstCollection(Integer integer) {
    System.out.println(integer);
    //process and save in collection
    return Flux.just(integer);
}

Flux<Integer> saveAllInSecondCollection(Integer integer) {
    System.out.println(integer);
    //process and save in collection
    return Flux.just(integer);
}

Flux<Integer> saveAllInThirdCollection(Integer integer) {
    System.out.println(integer);
    //process and save in collection
    return Flux.just(integer);
}
 类似资料:
  • 在要创建服务器的控制器中,我首先创建并保存服务器,然后将服务器添加到user中的服务器列表中,并保存该用户: 我认为我使用的方式是不对的。 要保存关系,我使用: 使用的存储库都是正常的ReactiveCrudRepositories。 用多个mono响应调用多个存储库的正确方法是什么?

  • 我试图保存多个记录通过 但是从上面来看,只创建了第一个数组。我哪里做错了?感谢您的帮助。

  • 我试图使用WebClient并行地发出请求,但我不知道如何执行,因为无论我做什么,代码都不会等待请求完成。如果我只执行一个请求(注释片段),一切正常。有人能帮我吗?

  • 问题内容: 我有2个Mongodb数据库通过2个MongoTemplate-s连接到Spring Boot应用程序: mongoTemplate (默认的bean名称,连接到默认的db) mongoAppTemplate (在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository-,但我也想创建一些使用mongoAppTemplate的东西。 如何配置2

  • 我有两个Mongodb数据库连接到一个Spring Boot应用程序,其中有两个MongoTemplate-s: mongoTemplate(默认的bean名称,连接到默认的db) mongoAppTemplate(在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository,但我也想创建一些使用mongoAppTemplate的。 如何配置2 MongoR

  • 我试着用多个共享偏好键来实现它,但它变得非常复杂。我看到一些人说使用JSON是可能的,但我不知道怎么做。 我的应用在ListView中有很多项,我想在每个项中保存几个值。 您可以想象一个联系人管理应用程序。当单击项目(人名)时,您可以检查电话号码、地址和图片等值。当然,它们可以被编辑、添加和删除。 有没有可能用JSON在单个键中保存值?这样我可以在单击每个项目时加载其值。