无法使用休眠 OGM 从 mongoDB 中删除元素

Posted

技术标签:

【中文标题】无法使用休眠 OGM 从 mongoDB 中删除元素【英文标题】:Unable to remove elements from mongoDB using hibernate OGM 【发布时间】:2016-09-30 14:20:47 【问题描述】:

我正在使用以下代码从给定 parent_id 的 mongoDB 集合中删除所有元素:

final String strQuery = "db.Child.remove('$query':'PARENT_ID':'" + parentId + "')";
                final Query query = entityManager.createNativeQuery(strQuery, Child.class);
                query.executeUpdate();

但是,我收到以下异常:

Unexpected Exception
com.mongodb.util.JSONParseException:
db.Child.remove('$query':'CHILD_ID':'7313c076-dbaa-4557-b80f-68d040b65d82')

如果我用find 替换remove,我会得到结果。不知道是什么导致上述本机查询中的 JSON 解析器错误。

我正在使用 hibernate-ogm 版本 4.3 Final 和 mongo-db 3.2

【问题讨论】:

所以我得出的结论是:我不能使用$query,因为它已被弃用且不再支持,并且休眠OGM 5.0.1不支持.sort()光标方法。除了我在我的代码中对它进行排序之外,还有其他选择吗? 这是不幸的,但这是由于 MongoDB 从 3.0 到 3.2 的更改不兼容。由于这些更改,OGM 5.0 不能很好地支持 MongoDB 3.2。我不久前在 master 分支中修复了它:见 github.com/hibernate/hibernate-ogm/pull/749/commits/… 。我们计划很快发布 OGM 5.1 的第一个 alpha 版本,使用起来应该非常安全。 我认为 JPA 有一个 em.remove 方法... 我需要删除所有 childs 与父 PARENT_ID。使用 em.remove,我需要遍历所有子元素并单独删除项目。 @ObaidMaroof 我们发布了支持 MongoDB 3.2 的 Hibernate OGM 5.0.2,应该可以正常工作。 HTH。 【参考方案1】:

Hibernate OGM 4.3 不支持本机查询的删除操作。

您应该尝试一下 OGM 5.0.2.Final:它应该可以解决您的问题,因为我们添加了对许多其他操作(以及许多其他修复和改进)的支持。

【讨论】:

在升级休眠 OGM 版本后,现在我得到以下信息:Caused by: com.mongodb.WriteConcernException: Write failed with error code 2 and error message 'unknown top level operator: $query' 好的,删除 $query 构造似乎已经成功了。您知道如何使用$orderBy 构造进行查找查询吗? 令人失望的是,文档here 中的示例并没有真正起作用。我无法使用 $query 构造,因为它因上述错误而失败。 这些示例适用于 MongoDB 3.0,这是 OGM 5.0 支持的版本。由于不兼容的更改,OGM 5.0 并不真正支持 MongoDB 3.2。它已在 master 中修复,并将包含在 5.1 版本中 - 我们希望尽快发布 alpha。

以上是关于无法使用休眠 OGM 从 mongoDB 中删除元素的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:不支持 PLAIN 方法

休眠 OGM Neo4j (5.0) Wildfly 10 错误。提供者 org.hibernate.ogm.service.impl.OgmIntegrator 不是子类型

使用 Hibernate OGM 的 MongoDb 身份验证

使用Hibernate OGM和云MongoDB Atlas M0(免费层)

Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?

当我尝试使用 Hibernate ogm 和 spring boot 时,控制台给出“无法实例化命名策略类”错误