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)
вместо этого при обновлении вложенных объектов. Однако здесь есть несколько соображений:
- Дополнительный код необходим для получения всего документа, анализа и обновления обязательных полей.
- поскольку
update(Entity entity)
работает на уровне документа, он также обновит неизмененные части документа, что не идеально.
1 ответ
Решение
Я предполагаю, что обнаруженная ошибка не означает ничего, кроме ограничения Panache
для mongoDB на данный момент через стандартный предлагаемый PanacheQL.
Эту проблему следует обойти, используя собственный Java API mongoDB, доступ к которому можно получить черезPanacheMongoEntityBase#mongoCollection
:
mongoCollection().updateOne(
eq("projectId", projectId),
new Document("$set", new Document("testCaseList", newTestCaseList))
);