MongoDB Panache возвращает void для операций записи
В "простой ванильной" MongoDB методы, выполняющие операцию записи в БД, такие как.insertOne() или.deleteOne(), будут возвращать InsertOneResult
или DeleteResult
соответственно. Эти объекты вернут логическое значение дляacknowledged
и id
где применимо. Это позволяет нам убедиться, что операция записи прошла успешно.
Однако в Panache MongoOperations.class
возвращается недействительным:
MongoOperations.class
private static void persist(MongoCollection collection, Object entity) {
collection.insertOne(entity);
}
Тогда возникает вопрос, как мы можем получить результат InsertResult
а также DeleteObject
объект?
используется зависимость pom
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-mongodb-panache</artifactId>
<version>1.5.0.Final</version>
1 ответ
Это выбор дизайна.
Мы решили сделать MongoDB с Panache как можно ближе к Hibernate с Panache, поэтому persist()
а также delete()
возвращает недействительность.
Мы не хотели раскрывать API, связанный с MongoDB (поэтому не возвращать InsertOneResult
или DeleteResult
) ни то, ни другое.
Итак, ваш вопрос касается доступа к acknowledged
логическое значение, чтобы убедиться, что операция была подтверждена на стороне MongoDB, а id
на случай, если вы создадите новые документы и позволите MongoDB управлять идентификатором за вас.
Вот несколько ответов:
- В
id
вычисляется перед вставкой в базу данных, вы можете получить его из объекта после вызоваpersist()
операции, он был бы заполнен драйвером MongoDB. - Проблема записи по умолчанию для MongoDB:
w:1
Это означает, что операция будет успешной, если главный (или автономный) узел подтвердил операцию. Это означает, что по умолчанию, если вызовpersist()
не генерировало исключение, операция была подтверждена. Если вы не настроите MongoDB с записьюw:0
, как толькоpersist()
операция выполнена успешно, это означает, что документ был вставлен в базу данных. - Для
delete()
действуют те же правила записи. Но мы не проверяли, что документ был удален (мы не проверяли значение deletedCount равным 1), возможно, это перебор, и мы могли это сделать. Если вы считаете, что мы должны это сделать, вы можете открыть проблему в репозитории Quarkus Github (это может нарушить обратную совместимость, поэтому нам нужно быть осторожными с этим).