【问题标题】:Query by Id in MongoTemplate Fails Due to Conversion to $oidMongoTemplate中的id查询因转换为$oid而失败
【发布时间】:2020-01-16 13:56:18
【问题描述】:

我有一个使用 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 的错误。

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

谢谢。

【问题讨论】:

  • 上面清楚地写着 Unknown operator: $oid.
  • 但是转换本身是自动完成的,我不知道如何传递正确的查询而不是使用 $oid 的查询。你在@ArpitJain 之前遇到过这种问题吗?
  • id 变量 _id 字段中的值是什么?
  • SpringData MongoDB的日志输出不是Mongo Shell格式,不能直接使用。 $oid 是由使用的extended json 格式产生的有效表示。

标签: mongodb spring-data-mongodb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    从 Spring Data mongodb 2.2.X @Id 运算符更改为 @MongoId 运算符。

    我这样使用并解决了。

    Mongodb 采集数据:

    _id: ObjectId('5e1f1bf501eb6332ebf8664c')
    

    Spring数据解决方案:

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

    【讨论】:

      【解决方案3】:

      你可以这样做: 自定义一个类扩展 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);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多