Spring Data MongoDB 教程

Criteria 比较查询

MongoDB 中的比较操作符用于比较两个值之间的关系,如:大于、等于等。常见的比较操作符有 $eq(等于)、$ne(不等于)、$gt(大于)、$gte(大于等于)、$lt(小于)和 $lte(小于等于)等等。比较操作符详细说明如下:

  • $eq 匹配等于指定的值,例如:db.t_01.find( { "name": { $eq:"david" } } )

  • $gt 匹配大于指定的值,例如:db.t_01.find( { "age" : { $gt: 30 } } )

  • $gt 匹配大于或等于指定的值,例如:db.t_01.find( { "age" : { $gte: 30 } } )

  • $in 匹配数组中的任意一个值,例如:db.t_01.find( { "age" : { $in : [ 30,40 ] } } )

  • $lt 匹配小于指定的值,例如:db.t_01.find( { "age" : { $lt: 30 } } )

  • $lte 匹配小于等于指定的值,例如:db.t_01.find( { "age" : { $lte: 30 } } )

  • $ne 匹配不等于指定值的所有值,例如:db.t_01.find( { "age" : { $ne: 30 } } )

  • $nin 匹配不在数组中出现的值,例如:db.t_01.find( { "age" : { $nin : [ 30,40 ] } } )

下面将介绍 Criteria 类中对比较操作符的定义,方法详细定义如下:

  • Criteria is(Object value) 等于

  • Criteria gt(Object value) 大于,使用 $gt 操作符创建一个 Criteria。

  • Criteria gte(Object value) 大于等于,使用 $gte 操作符创建一个 Criteria。

  • Criteria lt(Object value) 小于,使用 $lt 操作符创建一个 Criteria。

  • Criteria lte(Object value) 小于等于,使用 $lte 操作符创建一个 Criteria。

  • Criteria in(Object... values) 使用 $in 操作符创建一个 Criteria

  • Criteria in(Collection<?> values) 使用 $in 操作符创建一个 Criteria

  • Criteria isNull() 创建一个使用 null 进行相等性比较的 Criteria,匹配包含字段的值为 null 或不包含该字段的文档。

  • Criteria isNullValue() 创建一个使用 BsonType 进行比较的 Criteria,只匹配包含该字段的文档,其值等于 BsonType.NULL。

  • Criteria ne(Object value) 使用 $ne 操作符创建一个 Criteria

  • Criteria nin(Object... values) 使用 $nin 操作符创建一个 Criteria

  • Criteria nin(Collection<?> values) 使用 $nin 操作符创建一个 Criteria

示例

下面将演示如何使用 Criteria 类的 is()、gt()、gte()、lt()、lte() 方法过滤数据,代码如下:

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 java.util.List;

@SpringBootTest
class CriteriaDemo {

   @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").build());
   }

   @Test
   public void is() {
       // 查询 name 等于 Tom 的用户信息
       List<Person> personList = mongoTemplate.query(Person.class)
           .matching(Query.query(Criteria.where("name").is("Tom"))).all();
       for(Person person : personList) {
           System.out.println(person);
       }
   }

   @Test
   public void gt() {
       // 查询 age 大于 30 的用户信息
       List<Person> personList = mongoTemplate.query(Person.class)
               .matching(Query.query(Criteria.where("age").gt(30))).all();
       for(Person person : personList) {
           System.out.println(person);
       }
   }

   @Test
   public void gte() {
       // 查询 age 大于等于 30 的用户信息
       List<Person> personList = mongoTemplate.query(Person.class)
               .matching(Query.query(Criteria.where("age").gte(30))).all();
       for(Person person : personList) {
           System.out.println(person);
       }
   }

   @Test
   public void lt() {
       // 查询 age 小于 30 的用户信息
       List<Person> personList = mongoTemplate.query(Person.class)
               .matching(Query.query(Criteria.where("age").lt(30))).all();
       for(Person person : personList) {
           System.out.println(person);
       }
   }

   @Test
   public void lte() {
       // 查询 age 小于等于 30 的用户信息
       List<Person> personList = mongoTemplate.query(Person.class)
               .matching(Query.query(Criteria.where("age").lte(30))).all();
       for(Person person : personList) {
           System.out.println(person);
       }
   }

}
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号