java - MongoDB Panache 更新文档中的嵌套对象

标签 java mongodb quarkus quarkus-panache

我有一个如下所示的模型:

{
  "projectName": "MyFirstProject",
  "projectId": "1234",
  "testCaseList": [
    {
      "testCaseName": "TestCase1",
      "steps": [
        {
          "Action": "Click on this",
          "Result": "pass"
        },
        {
          "Action": "Click on that",
          "Result": "pass"
        }
      ]
    },
    {
      "testCaseName": "TestCase2",
      "steps": [
        {
          "Action": "Click on him",
          "Result": "pass"
        },
        {
          "Action": "Click on her",
          "Result": "pass"
        }
      ]
    }
  ]
}

但是,由于这是一个嵌套对象,我在使用以下方法更新它时遇到困难:

default PanacheUpdate update(String update, Object... params)

我正在使用存储库模式,下面是我的代码片段:

List<TestCase> newTestCaseList = ...;
update("testCaseList", newTestCaseList).where("projectId=?1",projectId);

这实际上引发了以下错误:

org.bson.json.JsonParseException: JSON reader was expecting ':' but found ','.
at org.bson.json.JsonReader.readBsonType(JsonReader.java:149)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:82)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
    at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
    at org.bson.BsonDocument.parse(BsonDocument.java:63)
    at io.quarkus.mongodb.panache.runtime.MongoOperations.executeUpdate(MongoOperations.java:634)
    at io.quarkus.mongodb.panache.runtime.MongoOperations.update(MongoOperations.java:629)

我目前的方法

目前对我有用的是在更新嵌套对象时使用default void update(EntityEntity)。 然而,这提出了一些考虑因素:

  1. 需要额外的代码来获取整个文档、解析并更新所需字段
  2. 由于 update(EntityEntity) 在文档级别工作,因此它还会更新文档中未更改的部分,这并不理想。

最佳答案

我猜遇到的错误只是说明目前通过提供的标准 PanacheQLmongoDBPanache 的限制。

应该使用 native mongoDB Java API 来解决该问题,该 API 可以通过 PanacheMongoEntityBase#mongoCollection 访问:

mongoCollection().updateOne(
        eq("projectId", projectId),
        new Document("$set", new Document("testCaseList", newTestCaseList))
);

关于java - MongoDB Panache 更新文档中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62446557/

相关文章:

java - Quarkus 中如何使用不同的数据源进行读写查询?

java - 在开发模式下使用 Quarkus 的 Maven 多模块项目

java - 在使用存储库模式时,如何使用 Hibernate 响应式(Reactive) Panache 库在 Quarkus 3.0.0.RC2 中响应式(Reactive)列出具有不同参数的实体?

java - 如何在 Java 中为 REST 服务获取 WSDL

java - 如何对地形和角色进行 3D 碰撞检测?龙王金格

java - Spring 框架: Byte Array is corrupted when received

FTP客户端的Java代码

node.js - Mongoose:获取最新记录,然后按另一个字段对它们进行排序

mongodb - Helm:无法通过值设置mongodb根密码

node.js - 获取 mongoDB API Node Express 中 3 个集合中的所有文档