2

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

然而,在 Panache 中,MongoOperations.class返回的是 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>
4

1 回答 1

3

这是一种设计选择。

我们选择使带有 Panache 的 MongoDB 尽可能接近带有 Panache 的 Hibernatepersist()delete()返回 void。

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

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

以下是一些答案:

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