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 (это может нарушить обратную совместимость, поэтому нам нужно быть осторожными с этим).
Другие вопросы по тегам