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

时间:2020-06-18 09:17:41

标签: 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(Entity entity)。 但是,这提出了一些注意事项:

  1. 需要额外的代码才能提取整个文档,进行解析并更新必填字段
  2. 由于update(Entity entity)在文档级别上工作,因此它也会更新文档的未更改部分,这是不理想的。

1 个答案:

答案 0 :(得分:2)

我想在通过提供的 PanacheQL 提供的标准的那一刻,遇到的错误只是对{em> mongoDB 的限制Panache

应该使用可以通过PanacheMongoEntityBase#mongoCollection访问的本地 mongoDB Java API解决此问题:

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