由于转换为 $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);
        }
    }