2

我有一个看起来像这样的模型:

{
  "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)在文档级别上工作,它还会更新文档中未更改的部分,这并不理想。
4

1 回答 1

2

我猜遇到的错误只是暂时通过提供的标准PanachePanacheQL说明 mongoDB限制。

应该使用可以通过以下方式访问的本机mongoDBPanacheMongoEntityBase#mongoCollection Java API 解决该问题:

mongoCollection().updateOne(
        eq("projectId", projectId),
        new Document("$set", new Document("testCaseList", newTestCaseList))
);
于 2020-06-19T11:52:06.273 回答