在 Spring 数据中通过 MongDB API 使用 DocumentDB 时如何使用 'id'?

How to use 'id' when using DocumentDB via MongDB API in Spring DATA?

我已经使用了 _id 中描述的两种映射方式 Spring Docs here

在我之前的项目中,我们使用 MongoDB 作为数据库,Spring 数据用于 DAO 操作。它对 StringBigInteger.

都没有任何问题

现在我们 using DocumentDB with MongoDB API(因为 Spring 数据不支持 DocumentDB)。 我可以使用所有 Spring 数据方法,但我无法使用自定义 ID。

下面是我的实体:

public class S{

    private String id;

    /* other fields here */

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    /* getters and setters for other fields */
}

这是 DAO:

public interface SDao extends MongoRepository<S, String> {

}

现在,如果我的代码中有任何地方我会这样做:

s = new S();
s.setId("some-id-here");

记录成功保存在数据库中,自定义 ID some-id-hereString(不是 ObjectId),但之后它抛出 ClassCastExceptionLong 无法转换为 Integer.

使用 BigInteger 作为 id 时也是如此。

如果我没有设置自定义id,即我将id的设置注释如下:

s = new S();
// s.setId("some-id-here");

没有抛出异常,但记录正在使用数据库本身提供的随机 ID 保存为 ObjectcId

我想用自定义 id 保存记录,以便我可以在需要时轻松更新它。 目前,如果我必须更新记录,我需要使用未映射到 _id 的键检索它,然后更新它,然后从数据库中删除旧记录,然后保留更新的记录,我觉得效率绝对低下,因为我无法使用 _id.

我的问题是为什么我得到 ClassCastException,这也提到了 LongInteger

的转换

DocumentDB 是否在内部执行某些引发此异常的转换。如果是,如何解决?这是一个错误吗?

id生成规则在这里解释link

另一种方法是让 DocumentDB/ MongoDB 默认为您创建 IDs。在您的 class 中,您可以有另一个字段可以用作自然 ID,并在该字段上创建一个唯一索引以进行提取优化。 参考 https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/ 索引。