MongoDB Panache Обновление вложенных объектов в документе - PullRequest
1 голос
/ 18 июня 2020

У меня есть модель, которая выглядит так:

{
  "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)

I Я использую шаблон репозитория, а ниже - мой фрагмент кода:

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 Ответ

2 голосов
/ 19 июня 2020

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

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

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