当使用MongoDB的Java驱动程序MongoTemplate时,如果使用findOne()方法通过id查询某个文档,可能会出现返回null的情况。那么这种现象背后的原因是什么,该怎样处理呢?下面是这个问题的完整攻略。
1. 问题原因
MongoTemplate的findOne()方法使用的是findById(),而findById()方法需要满足以下两个条件才能查找到对应的文档:
- 文档的主键必须是ObjectId类型;
- 查询时必须使用new ObjectId(id)格式传递id参数。
如果传递一个不合法的id参数,findById()方法就会返回null。因此,在使用MongoTemplate的findOne()方法查询文档时,要确保满足以上两个条件。
2. 解决方法
有几种方法可以解决通过MongoTemplate的findOne()方法查询文档返回null的问题:
(1)使用findById()方法
由于MongoTemplate的findOne()方法实际上是findById()方法的一种封装,因此可以直接使用findById()方法查询文档。具体的Java代码示例如下:
public MyObject findById(String id) {
return mongoTemplate.findById(new ObjectId(id), MyObject.class);
}
这里的MyObject是MongoDB中的一个文档对象,对应Java中的一个实体类。
(2)使用Criteria查询
另一种解决方法是使用Criteria查询。首先需要使用静态的Criteria.where()方法将条件传递给findById()方法。具体的Java代码示例如下:
public MyObject findById(String id) {
Criteria criteria = Criteria.where("_id").is(new ObjectId(id));
return mongoTemplate.findOne(Query.query(criteria), MyObject.class);
}
这里的Query.query()方法也是MongoTemplate提供的封装方法,用于将Criteria条件传递给findOne()方法。
3. 示例说明
下面是两条示例,用于说明通过MongoTemplate的findOne()方法查询文档返回null的问题以及解决方法的具体流程。
(1)示例1
假设我们有如下“users”文档集合,其中的主键是ObjectId类型的“_id”字段。
{
"_id" : ObjectId("5f2cf972ea9ef00cd4a67b49"),
"name" : "Alice",
"age" : 25
},
{
"_id" : ObjectId("5f2cf982ea9ef00cd4a67b4a"),
"name" : "Bob",
"age" : 30
}
当我们使用如下Java代码查询_id为5f2cf972ea9ef00cd4a67b49的文档时,返回结果是null:
User user = mongoTemplate.findOne(Query.query(Criteria.where("_id").is("5f2cf972ea9ef00cd4a67b49")), User.class);
这是因为在查询时使用的是字符串类型的id值,而不是ObjectId类型的id值。为了解决这个问题,可以使用ObjectId()方法将id参数转换为ObjectId类型,如下所示:
User user = mongoTemplate.findById(new ObjectId("5f2cf972ea9ef00cd4a67b49"), User.class);
这个方法会返回_id为5f2cf972ea9ef00cd4a67b49的文档对象。
(2)示例2
假设我们有如下“books”文档集合,其中的主键也是ObjectId类型的“_id”字段。
{
"_id" : ObjectId("5f2cfa32ea9ef00cd4a67b4b"),
"title" : "Java编程思想",
"author" : "Bruce Eckel"
},
{
"_id" : ObjectId("5f2cfa4cea9ef00cd4a67b4c"),
"title" : "Python基础教程",
"author" : "Magnus Lie Hetland"
}
当我们使用如下Java代码查询_id为null的文档时,也会返回null:
Book book = mongoTemplate.findOne(Query.query(Criteria.where("_id").is(null)), Book.class);
这是因为查询时传递的id参数为null。为了解决这个问题,可以使用findById()方法,如下所示:
Book book = mongoTemplate.findById(ObjectId.get(), Book.class);
这个方法会返回一条随机生成的_id的文档对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MongoTemplate通过id查询为null的问题 - Python技术站