MongoDB 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 ответ

Решение

Я предполагаю, что обнаруженная ошибка не означает ничего, кроме ограничения Panacheдля mongoDB на данный момент через стандартный предлагаемый PanacheQL.

Эту проблему следует обойти, используя собственный Java API mongoDB, доступ к которому можно получить черезPanacheMongoEntityBase#mongoCollection:

mongoCollection().updateOne(
        eq("projectId", projectId),
        new Document("$set", new Document("testCaseList", newTestCaseList))
);
Другие вопросы по тегам