MongoDB Panache return 写入操作无效

MongoDB Panache return void for write operations

在 'plain vanilla' MongoDB 中,对数据库执行写入操作的方法,例如 .insertOne() 或 .deleteOne(),将 return 一个 InsertOneResultDeleteResult 分别。这些对象将 return 为 acknowledged 的布尔值和适用的 id。这使我们能够确保写入操作成功。

但是,在 Panache 中,MongoOperations.class 是 returning void:

MongoOperations.class

private static void persist(MongoCollection collection, Object entity) {
    collection.insertOne(entity);
}

接下来的问题是,我们如何检索生成的 InsertResultDeleteObject 对象?

正在使用 pom 依赖项

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-mongodb-panache</artifactId>
    <version>1.5.0.Final</version>

这是一个设计选择。

我们选择使 MongoDB with Panache 尽可能接近 Hibernate with Panache,因此 persist()delete() returns 无效。

我们不想公开 MongoDB 相关的 API(所以不返回 InsertOneResultDeleteResult)。

因此,您的问题是关于访问 acknowledged 布尔值以确保操作已在 MongoDB 端得到确认,以及 id 以防您创建新文档和让 MongoDB 为您管理标识符。

这里有一些答案:

  • id 是在插入数据库之前计算的,您可以在调用 persist() 操作后从实体中检索它,它会由 MongoDB 驱动程序填充.
  • MongoDB 的默认写入问题是 w:1,这意味着如果主(或独立)节点已确认操作,则操作将成功。这意味着默认情况下,如果对 persist() 的调用没有抛出异常,则该操作已被确认。除非您将 MongoDB 配置为 w:0 的写入关注,否则一旦 persist() 操作成功,这意味着文档已被插入到数据库中。
  • 对于 delete() 操作,同样的写关注规则适用。但是我们没有检查文档是否已经被删除(我们没有检查 deletedCount 是否为 1),也许这是一个疏忽,我们可能已经完成了。如果您认为我们应该这样做,您可以在 Quarkus Github 存储库中提出一个问题(这可能会破坏向后兼容性,因此我们需要对此小心)。