Spring Data MongoDB 教程

Criteria 元素查询

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;
}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号