在SpringBoot中想要使用MongoDB的条件查询操作,可以通过整合Spring Data MongoDB来实现。在Spring Data MongoDB中提供了很多的复杂条件构建来实现复杂的条件查询,包括可以通过方法名查询、可以通过@Query注解查询和Criteria查询。下面我们就来详细介绍一下这些查询方法的具体操作方式。
演示实体对象
下面的方法操作,都是通过这个实体对象来进行演示的。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private int age;
// getters and setters
}
方法名查询(Query Methods)
在Spring Data MongoDB提供了方法名查询,可以通过定义存储库接口中的方法名来实现查询,但是需要注意的是方法名必须要遵守一定的名称规则,如下所示。
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
List<User> findByNameAndAge(String name, int age);
}
使用@Query注解查询
我们还可以在存储接口的方法上通过@Query 注解来定义MongoDB的查询语句操作,如下所示。
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import java.util.List;
public interface UserRepository extends MongoRepository<User, String> {
@Query("{ 'name': ?0 }")
List<User> findByName(String name);
@Query("{ 'age': { '$gt': ?0 } }")
List<User> findByAgeGreaterThan(int age);
@Query("{ 'name': ?0, 'age': ?1 }")
List<User> findByNameAndAge(String name, int age);
}
符号说明
- $eq:等于
- $ne:不等于
- $gt:大于
- $gte:大于等于
- $lt:小于
- $lte:小于等于
逻辑运算符
- $and:与
- $or:或
- $not:非
- $nor:非或
使用Criteria进行复杂查询
当查询条件较为复杂时,可以使用MongoTemplate和Criteria来构建查询条件,如下所示。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private MongoTemplate mongoTemplate;
public List<User> findUsers(String name, int minAge, int maxAge) {
Query query = new Query();
query.addCriteria(Criteria.where("name").is(name)
.and("age").gte(minAge).lte(maxAge));
return mongoTemplate.find(query, User.class);
}
}
使用Example查询
在Spring Data MongoDB中还支持了Example查询,通过这种方式适用于匹配实体属性的查询操作,如下所示。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findUsersByExample(User exampleUser) {
Example<User> example = Example.of(exampleUser);
return userRepository.findAll(example);
}
}
总结
以上是几种在Spring Boot中使用MongoDB进行条件查询的常见方法,具体选择哪种方式主要还是要根据自己的实际需求来确定。