Mongodb在Java中的查询操作:连接、筛选、聚合

在平常开发过程中,常常需要对数据表做连接查询、聚合查询等一系列查询操作,像常用的mysql数据库,有对应的"join in / join left / join right"以及"group by"等语法,而MongoDB要如何在Java编程中使用这些操作,下面是一个开发案例供参考。

程序中,需要引入的库为:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;

假设存在两个表tableOne和tableTwo,其各自类型如下:

【tableOne】

_idID
twoId表二ID
createdAt创建时间

 

 

 

 

【tableTwo】

_idID
name名称
type类型

 

 

 

 

对于表tableOne和表tableTwo的连接查询,在MongoDB中,可以使用 LookupOperation 进行初始化一个数据对象:

LookupOperation lookupOperation = LookupOperation.newLookup()
                .from("tableTwo")
                .localField("twoId")
                .foreignField("_id")
                .as("OneAndTwo");
在此连接中,from()定义从表名;localField()定义主表关联字段;foreignField()定义从表关联字段;as()定义表连接后的结果名。

完成数据表连接后,可以使用 Aggregation 进行语句定义:

// 定义查询的时间范围,开始时间当年第一天,结束时间当年最后一天
        LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().getYear(),1,1,0,0,0);
        LocalDateTime endTime = LocalDateTime.of(LocalDateTime.now().getYear(),12,31,23,59,59);


// 对上面连接后的结果表执行查询
            Aggregation aggregation = Aggregation.newAggregation(
                    lookupOperation

                    // 设置查询时间范围为当年
                    , Aggregation.match(Criteria.where("OneAndTwo.createdAt").gte(startTime).lte(endTime))

                    // 根据前端传参对象的查询名称name,查询对应的数据,name为你要查询的字符串
                    , Aggregation.match(Criteria.where("OneAndTwo.name").is(name))

                    // 对数据库表数据的时间进行转换,转为对应的月份
                    , Aggregation.project("createdAt")
                            .andExpression("{$month: '$createdAt'}").as("createdAt")

                    // 对数据库数据根据时间(月份)进行聚合,将聚合数存储在cout中
                    , Aggregation.group("createdAt")
                            .first("createdAt").as("createdAt")
                            .count().as("count")
            );

在上面的代码中,主要查询的操作有:【1】查询时间范围;【2】查询连接表的name字段中与常量name保存的字符串相同的数据;【3】将数据库中的时间转换为对应的月份;【4】根据月份聚合,得到每个月份对应的统计数据。

查询语句完成后,便可以开始执行查询操作,在查询操作前需建立一个对象,该对象需具备的属性名称,应与查询过程中选择输出的字段名一致,比如上面的查询语句,将输出【_id】默认输出ID【createdAt】输出月份【cout】统计数据,因此应该创建一个对象如下:

@Data
public class saveCTX {
    private String _id;
    private String createdAt;
    private Integer count;
}

创建一个如上的对象后,便可以使用 MongoTemplate进行查询,注意在查询前需要将MongoTemplate注入,否则在查询中会提示空值报错

 @Autowired
 public FormStatisticsServiceImpl(MongoTemplate mongoTemplate) {
     this.mongoTemplate = mongoTemplate;
 }

之后就可以进行查询了,建立一个saveCTX列表进行保存操作,执行查询:

// 创建一个对象列表,对象的属性需包含上面所设定字段,将上面数据库输出的数据存储返回
List<saveCTX> saveCTXES = mongoTemplate.aggregate(aggregation, "OneAndTwo",saveCTX.class).getMappedResults();

这样,查询到的数据就会存储在saveCTXS这个对象中了,可以进行后续的操作。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MongoDB 聚合框架提供了一种数据处理方式,它能够对集合的文档进行分组、筛选、投影、排序、限制以及多表关联等操作,从而生成新的文档集合。下面是几种 MongoDB 聚合查询方式的详解: 1. $match 查询 $match 查询通过筛选文档的字段来过滤数据,类似于 SQL 的 WHERE 子句。可以使用各种比较运算符、逻辑运算符和正则表达式等条件来实现高级查询。例如,以下代码将返回所有 age 大于等于 18 的文档: ``` db.collection.aggregate([ { $match : { age : { $gte : 18 } } } ]) ``` 2. $group 查询 $group 查询通过将文档分组来聚合数据。可以使用 $sum、$avg、$min、$max 等聚合运算符来计算每个分组的结果。例如,以下代码将返回每个国家的总人口数: ``` db.collection.aggregate([ { $group : { _id : "$country", population: { $sum : "$population" } } } ]) ``` 3. $project 查询 $project 查询用于投影文档的字段,类似于 SQL 的 SELECT 子句。可以使用 $addFields、$subtract、$multiply、$divide 等运算符来进行计算或添加新的字段。例如,以下代码将返回包含 name 和 age 字段的文档: ``` db.collection.aggregate([ { $project : { name : 1, age : 1 } } ]) ``` 4. $sort 查询 $sort 查询用于对文档进行排序,类似于 SQL 的 ORDER BY 子句。可以使用 1 或 -1 来指定升序或降序排列。例如,以下代码将按 age 字段降序排列文档: ``` db.collection.aggregate([ { $sort : { age : -1 } } ]) ``` 以上是 MongoDB 聚合查询的几种方式,它们可以组合使用来实现更复杂的查询。在 Java ,可以使用 MongoDBJava 驱动程序来进行聚合查询。具体的实现方式可以参考 MongoDB 的官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值