MongoDB - FindById不起作用并给出null

dffbzjpn  于 2023-08-04  发布在  Go
关注(0)|答案(4)|浏览(187)

我使用Sping Boot (V2.2.2.RELEASE)+ Spring Data Mongo示例。在这个例子中,我有如下记录

{
    "_id" : ObjectId("5cb825e566135255e0bf38a4"),
    "firstName" : "John",
    "lastName": "Doe"
}

字符串
我的仓库

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, ObjectId>{
    Employee findById(String id);
}


编码

Employee findById = employeeRepository.findById("5cb825e566135255e0bf38a4");
System.out.println(findById);


甚至下面的代码不工作

Query query = new Query(Criteria.where("id").is(new ObjectId("5cb825e566135255e0bf38a4")));
List<Employee> find = mongoTemplate.find(query, Employee.class);

m0rkklqb

m0rkklqb1#

看来有两个问题
1.应使用ObjectId

employeeRepository.findById(new ObjectId("5cb825e566135255e0bf38a4"))

字符串

  1. ID字段带有下划线
new Query(Criteria.where("_id").is(new ObjectId("5cb825e566135255e0bf38a4")))


我不是一个Java的家伙,所以可能会错过smth,但至少给予它一个尝试:)

n3h0vuf2

n3h0vuf22#

_id: ObjectId("5cb825e566135255e0bf38a4")中使用输入文档,可以使用这两种方法中的任何一种。假设employee集合中有文档,您可以通过_id的字符串值进行查询。

public class Employee {
     @Id
     private String id;
     private String name;

    // constructors (with and with arguments)
    // get methods
    // override toString()
}

// Spring-data app using MongoTemplate
MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
Query query = new Query(where("id").is("5cb825e566135255e0bf38a4"));
Employee emp = mongoOps.findOne(query, Employee.class);

字符串

  • 或 *

MongoRepository接口扩展了CrudRepository,除了与CrudRepository等通用持久性技术无关的接口外,还公开了底层持久性技术的功能。

@Repository
public interface EmployeeRepository extends MongoRepository<Employee, String> {
    @Query("{ 'id' : ?0 }")
    Optional<Employee> findById(String id);
}

// Spring-data app using the Repository
Optional<Employee> empOpt = employeeRepository.findById("5cb825e566135255e0bf38a4");

if (empOpt.isPresent()) {
    System.out.println(empOpt.get());
}
else {
   System.out.println("Employee not found!");
}

jhdbpxl9

jhdbpxl93#

如果你遇到这个问题,只需在Mongodb模式中添加“_id:String”。看看下面的代码…

const courseSchema = new mongoose.Schema({
    _id:String,
    name: String,
    author: String,
    tags: Array,
    isPublished: Boolean,
    price: Number,
    date: { type: Date, default: Date.now }
});

const Course = mongoose.model('Course', courseSchema);

async function updateCourse(id) {
    const course = await Course.findById(id);
    if (!course) {
        console.log('Course does not exist with the given ID');
        return;
    }
    course.isPublished = true;
    course.author = 'Another Author';

    const result = await course.save();
    console.log(result);
}

updateCourse('5a68fdd7bee8ea64649c2777');

字符串

3zwjbxry

3zwjbxry4#

我也面对了这个问题。有趣的是,在2.1.7版本中运行良好
<documentRepository>.findById(<StringID>)在2.2.2RELEASE中被视为String Id,而2.1.7RELEASE将其转换为ObjectId,因此查找查询可以工作。

相关问题