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