由于转换为 $oid,在 MongoTemplate 中按 Id 查询失败
Query by Id in MongoTemplate Fails Due to Conversion to $oid
我有一个简单的操作,可以使用 MongoTemplate 从 MongoDB 中删除文档。使用 MongoTemplate 的原因是因为该项目与使用数据库的服务没有直接关联,因此它不需要,也不应该需要数据库模型 类 本身。
查询如下:
Criteria criteria = Criteria.where("_id")
.is(new ObjectId(id));
mongoTemplate.remove(Query.query(criteria), collectionName);
其中id
是String对象,collectionName
是集合名称。
但是,当查询通过 Spring 数据 MongoDB 转换为 MongoDB 语法时,会产生这样的表达式:
{ "_id" : { "$oid" : "5e206994943f3c1d6c778efb"}}
而不是 { "_id" : ObjectId("5e206994943f3c1d6c778efb")}
.
因此,数据会保留在数据库中,即使它应该被删除。当我在 Mongo shell 本身上尝试前一个查询时,它会抛出 Unknown operator: $oid
.
的错误
我做错了什么吗?如何修复它们?
谢谢。
我终于能够通过使用 MongoDatabase 来解决这个问题。通过使用 deleteOne
方法,我能够通过 _id
删除并创建 new ObjectId(id)
,包裹在 BasicDBObject
.
下
来自 Spring 数据 mongodb 2.2.X @Id 运算符更改为 @MongoId 运算符。
我是这样用的,解决了。
Mongodb采集数据:
_id: ObjectId('5e1f1bf501eb6332ebf8664c')
Spring数据解:
@MongoId(targetType = FieldType.OBJECT_ID)
private String id;
你可以这样做:
自定义一个 class extends MappingMongoConverter,
并覆盖方法 convertId(Object id, Class> targetType)。
像这样:
@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);
}
}
我有一个简单的操作,可以使用 MongoTemplate 从 MongoDB 中删除文档。使用 MongoTemplate 的原因是因为该项目与使用数据库的服务没有直接关联,因此它不需要,也不应该需要数据库模型 类 本身。
查询如下:
Criteria criteria = Criteria.where("_id")
.is(new ObjectId(id));
mongoTemplate.remove(Query.query(criteria), collectionName);
其中id
是String对象,collectionName
是集合名称。
但是,当查询通过 Spring 数据 MongoDB 转换为 MongoDB 语法时,会产生这样的表达式:
{ "_id" : { "$oid" : "5e206994943f3c1d6c778efb"}}
而不是 { "_id" : ObjectId("5e206994943f3c1d6c778efb")}
.
因此,数据会保留在数据库中,即使它应该被删除。当我在 Mongo shell 本身上尝试前一个查询时,它会抛出 Unknown operator: $oid
.
我做错了什么吗?如何修复它们?
谢谢。
我终于能够通过使用 MongoDatabase 来解决这个问题。通过使用 deleteOne
方法,我能够通过 _id
删除并创建 new ObjectId(id)
,包裹在 BasicDBObject
.
来自 Spring 数据 mongodb 2.2.X @Id 运算符更改为 @MongoId 运算符。
我是这样用的,解决了。
Mongodb采集数据:
_id: ObjectId('5e1f1bf501eb6332ebf8664c')
Spring数据解:
@MongoId(targetType = FieldType.OBJECT_ID)
private String id;
你可以这样做: 自定义一个 class extends MappingMongoConverter, 并覆盖方法 convertId(Object id, Class> targetType)。 像这样:
@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);
}
}