MongoDB 中的元素查询操作符用来匹配具有指定字段的文档,常见的元素查询操作符如下:
$exists 操作符用来匹配具有指定字段的文档。例如:
db.t_01.find( { "name" : { $exists:true, $in: ["david", "grut"] } } )$type 操作符用来返回文档中字段为指定类型的文档。例如:
db.t_01.find( {"name" : {$type : "string" } } )下面将介绍怎样使用 Criteria 实现元素查询,Criteria 类定义的元素查询方法如下:
Criteria exists(boolean value) 使用 $exists 操作符创建一个 Creates
Criteria type(int typeNumber) 使用 $type 操作符创建一个 Creates
Criteria type(Collection<JsonSchemaObject.Type> types) 使用 $type 操作符创建一个 Creates
Criteria type(JsonSchemaObject.Type... types) 使用 $type 操作符创建一个 Creates
下面示例将演示怎样使用 Criteria 的元素查询方法实现元素查询,示例如下:
package com.hxstrive.springdata.mongodb;
import com.hxstrive.springdata.mongodb.entity.Person;
import org.junit.jupiter.api.BeforeEach;
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.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.schema.JsonSchemaObject;
import java.util.List;
@SpringBootTest
class CriteriaDemo3 {
@Autowired
private MongoTemplate mongoTemplate;
@BeforeEach
public void init() {
// 删除集合
mongoTemplate.dropCollection(Person.class);
// 准备数据
mongoTemplate.insert(Person.builder().id(100).name("Tom").age(27).email("Tom@sina.com").build());
mongoTemplate.insert(Person.builder().id(200).name("Helen").age(30).email("Helen@outlook.com").build());
mongoTemplate.insert(Person.builder().id(300).name("Bill").age(47).email("bill@gmail.com").build());
mongoTemplate.insert(Person.builder().id(400).name("Joe").age(20).email("joe@163.com")
.summary("User description information").build());
}
@Test
public void exists() {
// 查询文档中拥有 summary 字段的文档
Criteria criteria = Criteria.where("summary").exists(true);
List<Person> personList = mongoTemplate.query(Person.class)
.matching(Query.query(criteria)).all();
for(Person person : personList) {
System.out.println(person);
}
// 结果:
// Person(id=400, name=Joe, age=20, email=joe@163.com, summary=User description information)
}
@Test
public void type() {
// 查询文档中 summary 字段类型为 string,age 字段类型为 int 的文档
Criteria criteria = new Criteria();
criteria.andOperator(
Criteria.where("summary").type(JsonSchemaObject.Type.STRING),
Criteria.where("age").type(JsonSchemaObject.Type.intType())
);
List<Person> personList = mongoTemplate.query(Person.class)
.matching(Query.query(criteria)).all();
for(Person person : personList) {
System.out.println(person);
}
// 结果:
// Person(id=400, name=Joe, age=20, email=joe@163.com, summary=User description information)
}
}其中,Person 实体类的代码如下:
package com.hxstrive.springdata.mongodb.entity;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
@Builder
public class Person {
/** 用户ID */
private int id;
/** 用户姓名 */
private String name;
/** 年龄 */
private int age;
/** 电子邮件 */
private String email;
/** 个人说明 */
private String summary;
}