首页 > 数据库 >Spring Data MongoDB--MongoTemplate查询数据--方法/实例

Spring Data MongoDB--MongoTemplate查询数据--方法/实例

时间:2022-11-05 14:02:50浏览次数:50  
标签:-- Spring void criteria MongoTemplate query Criteria Query mongoTemplate


简介

说明

        本文用示例介绍Spring Data MongoDB(MongoTemplate)查询数据的方法。

查询方法分类

  • mongoTemplate.find  //返回list
  • mongoTemplate.findOne  //返回1个(查询1个)
  • mongoTemplate.findAll   // 返回list(查询所有)

简单查询

@Test
public void testEqual2() {
// 使用静态方法创建 Criteria
Criteria criteria = Criteria.where("press").is("清华大学出版社");

Query query = new Query(criteria);
final List<Book> books = mongoTemplate.find(query, Book.class, "book");
assert books.size() == 3;
}

支持的查询有:

  1. 等于:is
  2. 大于:gt
  3. 小于:lt
  4. 大于等于:gte
  5. 小于等于:lte
  6. 不等于:ne
  7. 模:mod 

多条件查询

@Test
public void testAnd() {
Criteria criteria = new Criteria();
criteria.and("price")
.gt(45)
.and("press").is("清华大学出版社");

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, BOOK_COLLECTION);
}

排序与分页

@Test
public void testSortAndLimit() {
Criteria criteria = Criteria.where("press").is("清华大学出版社");
Query query = new Query(criteria);

// with 方法设置排序
query.with(Sort.by(Sort.Direction.ASC, "price"));
// skip limit 方法设置分页
query.skip(1).limit(10);

final List<Book> books = mongoTemplate.find(query, Book.class, "book");
assert books.size() ==2;
}

正则查询

@Test
public void testContain(){
String name = "开发";
Pattern pattern = Pattern.compile("^.*" + name + ".*$", Pattern.CASE_INSENSITIVE);

Criteria criteria = Criteria.where("name").regex(pattern);

Query query = new Query(criteria);

final List<Book> books = mongoTemplate.find(query, Book.class, "book");
assert books.size() == 1;
}

数组查询

匹配数组中单个值

// 数组中包含查询单值
@Test
public void testArrayMatchSingle() {
Criteria criteria = Criteria.where("tags").is("编程");

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

匹配数组中多个值

// 数组中同时包含指定的多个值,不要求顺序
@Test
public void testArrayMatchAll() {
Criteria criteria = Criteria.where("tags").all("编程", "程序设计");

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

匹配数组中元素个数

@Test
public void testArrayMatchSize() {
Criteria criteria = Criteria.where("tags").size(4);

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

匹配指定位置元素

// 满足特定索引下条件
// 数组索引从 0 开始,匹配第二项就用 tags.1 作为键
@Test
public void testMatchIndex() {
Criteria criteria = Criteria.where("tags.1").is("编程");

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

匹配整个数组

// 元素个数和顺序都要匹配
@Test
public void testArrayMatch() {
Criteria criteria = Criteria.where("tags").is(new String[]{"程序设计", "编程", "python"});

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

匹配子文档

@Test
public void testMatchSubDoc() {
Criteria criteria = Criteria.where("authors.name").is("纪涵");

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

elementMatch

@Test
public void testElementMatch() {
Criteria criteria = Criteria.where("authors").elemMatch(Criteria.where("name").is("谢希仁").and("sex").is("男"));

Query query = new Query(criteria);

List<Book> books = mongoTemplate.find(query, Book.class, "book");
}

聚合查询

count

@Test
public void testCount() {
Query query = new Query();
long ret = mongoTemplate.count(query, "book");
System.out.println(ret);
}

distinct

@Test
public void testDistinct(){
List<String> distinctPress = mongoTemplate
.findDistinct(new Query(), "press", "book", String.class);
System.out.println(distinctPress);
}

sum、count、avg

@Test
public void testSum() {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("_id", "press", "price"),
Aggregation.group("press")
.count().as("count")
.sum("price").as("total")
.avg("price").as("avg")
);

AggregationResults<Map> aggregationResults = mongoTemplate
.aggregate(aggregation, "book", Map.class);
List<Map> mappedResults = aggregationResults.getMappedResults();
System.out.println(mappedResults);
}

带有表达式的计算

@Test
public void testSum2() {
// 定义乘法表达式, 可以是两个字段相乘或者字段与数字相乘
//同理,ArithmeticOperators 包含 加减乘除模等操作

ArithmeticOperators.Multiply price =
ArithmeticOperators.valueOf("PRICE").multiplyBy(5);

Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("_id", "press", "PRICE"),
Aggregation.group("press")
.count().as("count")
.sum(price).as("total")
.avg(price).as("avg")
);

AggregationResults<Map> aggregationResults = mongoTemplate
.aggregate(aggregation, "book", Map.class);
List<Map> mappedResults = aggregationResults.getMappedResults();
System.out.println(mappedResults);
}

标签:--,Spring,void,criteria,MongoTemplate,query,Criteria,Query,mongoTemplate
From: https://blog.51cto.com/knifeedge/5825951

相关文章

  • Spring Cloud LoadBalancer--自定义负载均衡策略--方法/实例
    简介说明    本文用示例介绍SpringCloudLoadBalancer如何自定义负载均衡策略。        SpringCloudLoadBalancer的默认负载均衡策略为轮询策略。我们可......
  • 数据库事务
    事务是逻辑上的一组操作,要么都执行,要么都不执行。事务的四大特性(ACID)原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用......
  • [Linux]----文件操作(重定向+缓冲区)
    文章目录​​前言​​​​一、重定向​​​​具体操作​​​​dup2​​​​二、关于缓冲区的理解​​​​1.什么是缓冲区​​​​2.为什么要有缓冲区​​​​3.缓冲区在......
  • containerd和shim通信
    containerd-shim-runc-v2启动了一个ttrpcserver(类似grpc)containerd通过ttrpc和containerd-shim-runc-v2 通信来管理容器serviceTask{ rpcState(StateReques......
  • 关于rocketmq 中日志文件路径的配置
    rocketmq中的数据和日志文件默认都是存储在​​user.home​​路径下面的,往往我们都需要修改这些路径到指定文件夹以便管理。服务端日志网上搜索rocketmq日志存储路径的修改......
  • Atomsk孪晶多晶建模方法
    大家好,我是小马老师。本文介绍atomsk孪晶多晶建模方法。atomsk多晶建模的原理是先建立一个晶胞,然后编写一个polycrystal.txt文件,设定最终模型的尺寸和晶粒的个数。atomsk按......
  • 29. 两数相除
    29.两数相除题解:a/b=y等价于b>a-(b*y)>0,只要求出减了多少次b就好了。一个一个地减b,效率太低了,最坏情况下,a=2^31-1,b=1,超时;应该先预......
  • JS中的变量声明
    一、引入1.定义:在JavaScript中创建变量被称为“声明”变量。JavaScript中变量声明又分为显示声明和隐式声明。其中显示声明中,被“声明”变量之前的关键词有var、let、cons......
  • Typora打不开了
    按Windows+R打开运行窗口,输入regedit,点确定,打开注册表,依次展开计算机\HKEY_CURRENT_USER\SOFTWARE\Typora,然后在Typora上右键,点权限,选中Administrtors,把权限全部设置为拒......
  • Jmeter断言之Xpath Assertion
    Xpath:XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。首先添加XpathAssertionXpathAssertion界面......