无法使用休眠 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 中删除元素的主要内容,如果未能解决你的问题,请参考以下文章
休眠 OGM Neo4j (5.0) Wildfly 10 错误。提供者 org.hibernate.ogm.service.impl.OgmIntegrator 不是子类型
使用 Hibernate OGM 的 MongoDb 身份验证
使用Hibernate OGM和云MongoDB Atlas M0(免费层)