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

使用Spring-Data MongoDB和Spring MVC更新对象/文档的模式

唐阳泽
2023-03-14

我试图提出一种可重用的模式,用于在结合使用Spring数据和Spring MVC时更新MongoDB文档。

用例通常可以总结为:

  1. 使用存储库在Mongo中创建文档。保存()

如果我使用存储库。save()方法在步骤3中,我将丢失文档中未绑定到表单的所有数据。让表单负责整个文档是很脆弱的,因此MongoTemplate的findAndModify()方法似乎就在这里派上了用场。

要使用findAndModify()方法,我创建了支持toMap()方法的Form对象,该方法将Form对象的属性作为Map并删除一些字段(例如class和id)。这使我得到一个仅包含我关心的来自Form对象的字段的Map。将对象ID和此映射传递给我自定义存储库上的update()方法,我构建可以传递给findAndModify()方法的Query和Update对象。

使用这种方法,我可以轻松地将字段添加到我的对象中,并且只担心有我不想从表单发布中更新的字段的实例。应保留不受表单操作的文档字段。同时使用存储库和MongoTemboard似乎仍然有点复杂,所以我想知道是否有更好的示例来处理这个问题。在使用Mongo和Spring MVC时,这似乎应该是一个一致的模式(至少)。

我创建了一个示例项目,展示了如何在GitHub上实现此模型。Spock测试显示了使用save()对文档进行“更新”将如何按预期清除字段以及我的update()方法。

https://github.com/watchwithmike/diner-data

当使用Spring MVC和Spring数据处理文档的部分更新时,其他人在做什么?

共有1个答案

邢凌
2023-03-14

如果你拿走了用户提供的任何东西,只是把它放在数据库中,你就有可能做一些危险的事情,比如更新或创建他们不应该做的数据。相反,您应该首先查询Mongo以获取文档的最新版本,更改任何字段(看起来您使用的是Groovy,这样您就可以遍历所有属性并在新文档上设置它们),然后保存新的完整文档。

如果要进行小的、一致的更新(如增加投票数等),可以使用MongoTemplate创建自定义MongoDB查询,以更新几个字段。查看spring data mongodb文档了解更多信息。您还可以向使用MongoTemplate的MongoRepository添加自定义方法。

 类似资料:
  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 我已经实现了Serializable、实现了hashCode和equals。 我在MongoDB文档类中使用自定义键类,如下所示。 我可以使用spring data mongodb将文档保存到mongodb中。 我首先使用的标准如下。 根据上述标准,我然后执行一个update状态, 但是,我的更新失败,出现错误,

  • 我在Elasticsearch中索引了一个文档,如下所示: 我尝试通过以下命令更新计数字段: 但是,我收到了以下错误: 我到底做了什么,却不见了?我在http://www.elasticsearch.org/guide/reference/api/update.html跟踪文件,但它不起作用。 此外,我还包括父字段: 但还是没有成功。有人能帮我解决这个错误吗?

  • 我有一个模型看起来是这样的: 我正在使用存储库模式,下面是我的代码片段: 这实际上会引发以下错误: 我目前的做法 当前对我有效的是在更新嵌套对象时使用。然而,这提出了几点考虑: 需要额外的代码来获取整个文档、解析和更新必需的字段 由于在文档级别上工作,因此它还将更新文档中未更改的部分,这并不理想。

  • 问题内容: 我有以下请求处理程序 和以下mongodb反应式存储库 问题在于执行该方法后,对象中没有任何更改。我设法解决了这个问题,但是我不知道为什么在其他存储库中进行的第一个保存有效,而这个无效。为什么要这样做? 问题答案: 除非有人订阅了反应式发布者,否则什么都不会发生。这就是为什么当您使用block()时它开始起作用的原因。如果您需要调用数据库并在另一个数据库请求中使用结果,而不是使用诸如m

  • 我有如下elasticsearch文档,其中我需要根据creationtime currentdate更正年龄值 年龄=创建时间-当前日期 : 我想根据每个文档ID进行批量更新,但问题是我需要更正6个月的数据 有没有一种方法可以做到这一点,而不是循环遍历,我遇到的所有使用Pandas数据帧进行更新的示例都是基于已知值的。但是在这里_id我将在代码运行时得到。 我写的逻辑是获取所有文档 谁能给我一些