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

当修改的字段不总是相同时,如何更新MongoDB文档的字段?

范鸿
2023-03-14

假设我有一个Foo类和一个jax-rs FooResource,它将API公开给CRUD Foos。

Foo表示MongoDB文档。

在FooResource中,我将有如下内容:

@PATCH
@Path("{id}")
public Response update(@PathParam("id") ObjectId id, Foo foo) {
    return Response.ok(fooService.update(id, foo)).build();
}

问题是,json中的foo对象将只包含已经更改的字段,但我从来不知道它将是什么字段。

我使用带Panache扩展的Quarkus,我看到的唯一方法是从DB检索实体,然后检查从http请求接收到的foo对象中的每个字段,看看它是否为空,如果不是,在实体中设置新值,最后对其调用update()。

但如果我的课上有几十个字段,那就成了噩梦。这是一个如此常见的用例,以至于我无法想象(或者不愿相信)这是实现这一点的唯一方法。

如果有一种方法可以将一个不完整的文档发送到MongoDB中,这样它就只需要更改文档中的字段,那就完美了。但我没找到办法这么做。既不使用quarkus(带或不带panache),也不使用mongo API的java驱动程序。

那么有没有更简单的方法做到这一点呢?我更喜欢使用带有Panache扩展的quarkus MongoDB的解决方案,但不使用Panache的解决方案,甚至直接使用java驱动程序API也可以。

多谢了。

共有1个答案

汪信鸥
2023-03-14

您可以使用update(updateDocument,updateParams).where(query,params)方法,它提供了更灵活的更新方法。

根据文档指南中的示例:

// set the name of all living persons to 'Mortal'
long updated = Person.update("name", "Mortal").where("status", Status.Alive);

对于您的用例,查询部分位于_id字段上,但您仍然需要根据foo对象的字段存在动态构建更新部分。

  • 伪造带有所需字段的更新文档(这是“update(updateDocument,updateParams).where(query,params)”为您执行的操作)。
  • 首先获取实体,手动合并它(您可以轻松地为此创建一个基于反射的帮助程序),然后更新它。
 类似资料:
  • 使用Firebase Firestore,我将聊天室的详细信息存储在包含以下数据的文档中: 我的应用程序和规则要求在“创建”文档时设置这些字段。但是,我也希望允许授权用户“更新”文档。 我已经进行了检查,只允许某些用户更新文档,并验证他们不允许修改“createdate”这样的字段。但是,我似乎无法创建一个规则来强制授权用户不删除“createdate”字段,无论是通过传递filedvalue.d

  • 我有多个mongodb文档,其中有一些不同的字段,但有一个相同的字段名作为标识符。如何使用同一字段查询不同的文档?例如,以下文档都有一个“name”字段,但没有其他公共字段。 如果我想询问所有23岁的男性,我会怎么做?以下代码不返回任何内容,因为没有包含这两个字段的文档。相反,有两个单独的文档,每个文档都有一个匹配字段。

  • 我不得不向现有文档添加一个新字段/s。 下面是用于测试目的的过程AddNewField。 我做错了什么? 在调用fmongo.update后,我的收藏现在有两个文档!

  • 本文向大家介绍如何在MongoDB中获得不同的子文档字段值列表?,包括了如何在MongoDB中获得不同的子文档字段值列表?的使用技巧和注意事项,需要的朋友参考一下 若要获取不同的子文档字段值列表,可以使用dot(。)。语法如下- 为了理解这个概念,让我们用文档创建一个集合。使用文档创建集合的查询如下- 在method的帮助下显示集合中的所有文档。查询如下- 以下是输出- 这是获取子文档字段值的唯一

  • 我正在使用Android MVVM架构和LiveData。我有一个这样的物体 我的视图模型是这样的 如何确保用户对象中的某个字段发生更改时,观察员收到通知?顺便说一句,重要的是要将这些数据保存在单独的对象中,而不是在ViewModel中使用字符串等主要值。

  • 我正在尝试使用Spring Data mongodb更新mongodb中嵌入文档中的数组字段。 我想在mongodb集合中更新/插入的文档结构如下所示。 可以有更多这样的文档基于每个类型的部门,如“销售”,“市场营销”等。 即使这样做有效,我也不确定在Spring Data MongoDB中实现相同的功能是否有类似的支持。 另外,我的另一个查询是,如果我想为多个部门添加/更新员工,比如“Accou