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; }