Spring Data MongoDB 中,你可以使用 Query 和 Criteria 类来表示查询。它们的方法名称和 MongoDB 的本地操作符名称一致,例如 lt、lte、is 等。
Query 和 Criteria 类遵循链式风格的 API,因此你可以将多个方法和查询链接起来。 为了提高可读性,静态导入让你避免使用 'new' 关键字来创建 Query 和 Criteria 类的实例。当然,你也可以使用 BasicQuery 从普通的 JSON 字符串中创建 Query 实例。
使用 BasicQuery 通过 JSON 字符串构建 “年龄小于30,名称包含‘l’字符” 的查询条件。如下:
(1)Person 实体代码
package com.hxstrive.springdata.mongodb.entity;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* 用户
* @author hxstrive.com
*/
@Document("person")
@TypeAlias("pers")
@Data
@Builder
@ToString
public class Person extends Contact {
/** ID,自动映射到 MongoDB 的 _id 字段 */
private String id;
/** 姓名 */
private String name;
/** 年龄 */
private int age;
/** 版本 */
@Version
private long version;
}(2)客户端代码,通过 MongoTemplate 查询数据,代码如下:
package com.hxstrive.springdata.mongodb.query;
import com.hxstrive.springdata.mongodb.entity.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.BasicQuery;
import java.util.List;
@SpringBootTest
public class BasicQueryTest {
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void contextLoads() {
// 删除集合,清空数据
mongoTemplate.dropCollection(Person.class);
// 准备数据
mongoTemplate.insert(Person.builder().id("1").name("Tom").age(22).build());
mongoTemplate.insert(Person.builder().id("2").name("Helen").age(29).build());
mongoTemplate.insert(Person.builder().id("3").name("Bill").age(37).build());
mongoTemplate.insert(Person.builder().id("4").name("Joe").age(48).build());
// 查询数据
// 年龄小于30岁,且名称中包含 “l” 字符
BasicQuery query = new BasicQuery("{ age : { $lt : 30 }, name : { $regex : 'l' }}");
List<Person> result = mongoTemplate.find(query, Person.class);
for(Person person : result) {
System.out.println(person);
}
}
}运行代码,输出如下:
Person(id=2, name=Helen, age=29, version=1)