当前位置: 首页 > 面试题库 >

使用Spring数据MongoDB和Kotlin更新对象不起作用

范云
2023-03-14
问题内容

我有以下请求处理程序

fun x(req: ServerRequest) = req.toMono()
    .flatMap {
        ...
        val oldest = myRepository.findOldest(...) // this is the object I want to modify
        ...
        val v= anotherMongoReactiveRepository.save(Y(...)) // this saves successfully
        myRepository.save(oldest.copy(
                remaining = (oldest.remaining - 1)
        )) // this is not saved
        ok().body(...)
    }

和以下mongodb反应式存储库

@Repository
interface MyRepository : ReactiveMongoRepository<X, String>, ... {
}

问题在于save()执行该方法后,对象中没有任何更改。我设法解决了这个问题,save().block()但是我不知道为什么在其他存储库中进行的第一个保存有效,而这个无效。为什么要这样做block()


问题答案:

除非有人订阅了反应式发布者,否则什么都不会发生。这就是为什么当您使用block()时它开始起作用的原因。如果您需要调用数据库并在另一个数据库请求中使用结果,而不是使用诸如map(),flatMap()等Mono
/ Flux运算符…来构建所需所有操作的管道,然后返回结果Mono / Flux作为控制器的响应。Spring将订阅该Mono /
Flux并返回请求。您不需要阻止它。并且不建议这样做(使用block()方法)。

简短示例如何在Java中使用MongoDB反应存储库:

@GetMapping("/users")
public Mono<User> getPopulation() {
    return userRepository.findOldest()
            .flatMap(user -> {              // process the response from DB
                user.setTheOldest(true);
                return userRepository.save(user);
            })
            .map(user -> {...}); // another processing
}


 类似资料:
  • 我正在使用Quarkus和PanacheRepository进行一些测试,在更新实体数据时遇到了麻烦。更新不起作用,字段值不会更新。 简而言之:我创建一个实体并持久化数据,然后在另一个请求中,我使用,更改一些字段值,但新值不会持久化在数据库中。我尝试调用after,但行为相同,数据不会更新。 我用Quarkus版本1.9.0.Final、1.9.0.CR1、1.8.3.Final尝试过 我正在使用

  • 我试图提出一种可重用的模式,用于在结合使用Spring数据和Spring MVC时更新MongoDB文档。 用例通常可以总结为: 使用存储库在Mongo中创建文档。保存() 如果我使用存储库。save()方法在步骤3中,我将丢失文档中未绑定到表单的所有数据。让表单负责整个文档是很脆弱的,因此MongoTemplate的findAndModify()方法似乎就在这里派上了用场。 要使用findAnd

  • 互联网上充斥着处理数组的资源,但对象通常更适合数据,而且似乎更高效。 我想在动态字段名下存储键值对象,如下所示: 这样做似乎比保留一个包含所有语言的数组并对其进行过滤以获取给定语言的所有语言条目更有效。 我的问题是:如何使用猫鼬将键值对插入到具有动态名称的对象中?对象是否需要存在,或者如果在一个操作中不存在,我可以创建它吗? 我试过这个: 但不管我是否有一个空对象开始,都没有运气:。 奖励:我应该

  • mongodb新手,尝试更新文档的多个数组对象字段。没有得到预期的结果 文档结构: 基于id需要更新日期 Spring启动代码 但是当我运行这个查询时,它返回null。有人能帮我吗?谢谢,我也试过了

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

  • 我正在用一些初始数据绘制一个条形图,然后在单击按钮时尝试更新。我收到错误“未捕获的类型错误:无法读取未定义的属性'长度'”。单击更新后,将发生错误。如何解决此问题并启用更新功能以绘制新的条形图? D3代码: