在 mongoTemplate 中按 id 查询由于转换为 $oid 而失败



我有一个简单的操作,使用MongoTemplate从MongoDB中删除文档。使用 MongoTemplate 的原因是项目与使用数据库的服务没有直接关联,因此它不需要也不应该要求数据库模型类本身。

查询如下:

Criteria criteria = Criteria.where("_id")
.is(new ObjectId(id));
mongoTemplate.remove(Query.query(criteria), collectionName);

其中id是 String 对象,collectionName是集合的名称。

但是,当 Spring Data MongoDB 将查询转换为 MongoDB 语法时,会产生这样的表达式:{ "_id" : { "$oid" : "5e206994943f3c1d6c778efb"}}而不是{ "_id" : ObjectId("5e206994943f3c1d6c778efb")}.

因此,数据将保留在数据库中,即使应将其删除也是如此。当我在Mongo shell本身上尝试前一个查询时,它抛出了Unknown operator: $oid的错误。

我做错了什么吗?如何解决它们?

谢谢。

我终于能够通过使用MongoDatabase来解决这个问题。通过使用该方法deleteOne我能够通过创建new ObjectId(id)_id删除,包装在BasicDBObject下。

来自 Spring Data mongodb 2.2.X @Id运算符随@MongoId运算符更改。

我这样用过并解决了。

Mongodb收集数据:

_id: ObjectId('5e1f1bf501eb6332ebf8664c')

弹簧数据解决方案:

@MongoId(targetType = FieldType.OBJECT_ID)
private String id;

你可以这样做: 自定义 a 类扩展 MappingMongoConverter, 和覆盖方法转换 Id(对象 id, 类<?> 目标类型(。喜欢这个:

@Override
public Object convertId(Object id, Class<?> targetType) {
if (id == null || ClassUtils.isAssignableValue(targetType, id)) {
return id;
}
if (ClassUtils.isAssignable(ObjectId.class, targetType)) {
if (id instanceof String) {
if (ObjectId.isValid(id.toString())) {
return id.toString();
}
}
}
try {
return getConversionService().canConvert(id.getClass(), targetType)
? getConversionService().convert(id, targetType)
: convertToMongoType(id, null);
} catch (ConversionException o_O) {
return convertToMongoType(id, null);
}
}

最新更新