java - 如何在没有 ObjectId 的情况下将 Mongo 与 Spring Data 一起使用

标签 java spring-boot spring-data spring-data-mongodb

我有一个现有的 mongo 数据库,其中 id (_id) 作为纯字符串保存。这是 Mongo DB 中的示例数据:

{
    "_id" : "528bb0e2e4b0442f1479f1b4",
    "schoolId" : "URDLKYLFJXLWJGR193778316742298",
    "surname" : "Lewis",
    "admissionNumber" : "0347",
    "firstName" : "Martins"
}

我有一个 Java 对象,它的形式是:

public class Student {

@Id
private String id;
private String schoolId;
private String surname;
private String admissionNumber;
private String firstName;
}

使用 getter 和 setter

我还有一个仓库:

public interface StudentRepository extends MongoRepository<Student, String> {

    Student findOneBySurname(String surname);
    Student findOneById(String id);
    Student findOneBySurnameAndFirstName(String surname, String firstName);
}

当我执行 studentRepository.findAll() 时,我能够获取数据库中的所有学生,并正确填充他们的所有字段。

当我执行 studentRepository.findOne("528bb0e2e4b0442f1479f1b4") 或 studentRepository.findOneById)"528bb0e2e4b0442f1479f1b4") 时,它返回 null

当我对 mongo 查询进行调试时,我可以看到它正在调用:

2015-11-19 16:06:32.327 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoTemplate      : findOne using query: { "id" : "528bb0e2e4b0442f1479f1b4"} fields: null for class: class com.ad.josh.domain.Student in collection: Student
    2015-11-19 16:06:32.331 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoDbUtils       : Getting Mongo Database name=[joshdb]
    2015-11-19 16:06:32.333 DEBUG 87081 --- [           main] o.s.data.mongodb.core.MongoTemplate      : findOne using query: { "_id" : { "$oid" : "528bb0e2e4b0442f1479f1b4"}} in db.collection: josh.Student

通常我可以看到它仍在使用对象 ID 而不是普通字符串进行查询。

我看到了以下建议:

Create a Converter which throws a RuntimeException

但这行不通;它只是抛出一个 RuntimeException。

对于如何使用 Spring Data 访问已将 ID 定义为字符串(在现有数据库中)的 Mongo 数据库,我们将不胜感激。

最佳答案

我认为这里的问题是错误的“_id”格式,这就是为什么 Mongo 无法识别具有此类 id 的任何对象。它应该看起来像 ObjectId("528bb0e2e4b0442f1479f1b4"),而不是普通的 String 类型。

        {
            "_id" : ObjectId("528bb0e2e4b0442f1479f1b4"),
            "schoolId" : "URDLKYLFJXLWJGR193778316742298",
            "surname" : "Lewis",
            "admissionNumber" : "0347",
            "firstName" : "Martins"
        }

因此,如果您已将包含现有数据的 .json 导入到 mongo,则需要更改 id:

"_id": {$oid:"528bb0e2e4b0442f1479f1b4"},

并且应该转换成正确的格式。

希望对大家有所帮助。

关于java - 如何在没有 ObjectId 的情况下将 Mongo 与 Spring Data 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33809010/

相关文章:

java - 为什么提取服务器时间戳而不是保存在数据库中的时间戳?如何区分它们?

java - 使用反射设置私有(private)静态最终字段

Spring security antMatcher 没有按预期工作

java - Spring Boot/Spring LDAP 获取用户的成员列表

java - Spring Data JPA 是否忽略 @Fetch 注释?

java - 为什么此代码打印 100 而不是 1?

java - Spring Boot 忽略 Group Authorities 身份验证

java - Mongo、spring 和序列化

java - 如何将具有 2 个实体名称的相同类迁移到 Spring Data JPA?

java - 需要数组,但已找到(类名)