Spring Boot MongoDB场景下无法删除数组内嵌入对象如何解决
MongoDB数组元素删除失效问题解决
失效原因
导致操作不生效的核心原因通常为以下3种:
- 查询条件字段映射错误:MongoDB默认主键字段为
_id,若未在实体类主键上配置@Id/@Field映射,直接使用id作为查询字段无法匹配到对应文档 - 主键类型不匹配:如果MongoDB中
_id存储为ObjectId类型,直接传入字符串类型的id值会导致查询匹配失败 pull操作参数构造存在兼容性问题,使用BasicDBObject构造匹配条件在部分Spring Data MongoDB版本中会出现匹配失效
修正方案
方案1:实体类主键为String类型(加了@Id注解)
// 改用MongoDB原生主键字段`_id`作为查询条件 Query query = Query.query(Criteria.where("_id").is("61249cb6709f5f61ec6d8372")); // 改用Spring Data原生Criteria构造pull匹配条件,兼容性更强 Update update = new Update().pull("carts", Criteria.where("cartId").is("cartId-1")); // 单文档匹配用updateFirst即可,无需用updateMulti mongoTemplate.updateFirst(query, update, Users.class);
方案2:MongoDB中_id为ObjectId类型
Query query = Query.query(Criteria.where("_id").is(new ObjectId("61249cb6709f5f61ec6d8372"))); Update update = new Update().pull("carts", Criteria.where("cartId").is("cartId-1")); mongoTemplate.updateFirst(query, update, Users.class);
问题排查方法
可以通过返回结果快速定位问题:
UpdateResult result = mongoTemplate.updateFirst(query, update, Users.class); // 匹配数为0:查询条件错误,优先排查主键字段和类型 long matched = result.getMatchedCount(); // 匹配数>0但修改数为0:carts数组中无对应cartId的元素 long modified = result.getModifiedCount();
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

