事务、批量插入、聚合操作 (count、sum)

批量插入

@Test
public void testDelete() {
    List<UserDoc> userDocs = Arrays.asList (
            new UserDoc (3, "xiaoding", 1000, new Date ()),
            new UserDoc (5, "xiaobai", 2000, new Date ()));
    mongoTemplate.insert (userDocs, UserDoc.class);
}

副本集的 yaml 配置!!

spring.data.mongodb.uri=mongodb://192.168.111.101:27017,192.168.111.102:27017,192.168.111.103:27017/baizhi?replicaSet=r0

事务

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

yaml

# mongodb 没有开启任何安全协议
# mongodb(协议)://192.168.111.101:27017(端口)/baizhi(库名)
spring.data.mongodb.uri=mongodb://192.168.111.101:27017/baizhi
# mongodb 存在密码
#spring.data.mongodb.host=tx.chenyn.cn
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=baizhi
#spring.data.mongodb.username=root
#spring.data.mongodb.password=root

启动类加注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run (DemoApplication.class, args);
    }

    @Bean
    public MongoTransactionManager transactionManager(MongoDatabaseFactory mongoDatabaseFactory) {
        return new MongoTransactionManager (mongoDatabaseFactory);
    }
}

测试

@Test
@Transactional
public void testDelete() {

    mongoTemplate.insert (
            new UserDoc (6, "xiaohei", 3000, new Date ()));

}

聚合API

配置好后在类中注入MongoTemplate对象

@Autowired
private MongoTemplate mongoTemplate;

常用函数#
使用前我们先来了解一下常用的函数

Aggregation.group() : 聚合函数,将某个字段或者某个数组作为分组统计的依据,在group的基础上又扩展出以下函数:

  • sum() : 求和
  • max() : 获取最大值
  • min() : 获取最小值
  • avg() : 获取平均值
  • count() : 统计条目数
  • first () : 获取group by 后的某个字段的首个值
  • last() : 获取 group by 后的某个字段的最后一个值
  • push() : 在结果文档中插入值到一个数组中
  • addToSet() : 在结果文档中插入值到一个数组中,但不创建副本(作为集合)。
    Aggregation.match() : 过滤函数,主要存储过滤数据的条件,输出符合条件的记录
    Aggregation.project(): 修改数据结构函数,将前面管道中的获取的字段进行重名,增加,修改字段等操作。
    Aggregation.unwind():将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。当preserveNullAndEmptyArrays为true时,将包括字段为null,空,或者缺失的数据;
    Aggregation.sort(): 排序函数,将上级管道的内容按照某个字段进行排序并且输出。值为1升、-1降。sort一般放在group后,也就是说得到结果后再排序,如果先排序再分组没什么意义;
    Aggregation.limit(): 限制输出函数,将聚合返回的内容限定在某个条目之内。通常作为页面大小
    Aggregation.skip(): 跳过指定数量的条目再开始返回数据的函数,通常和sort(),limit()配合,实现数据翻页查询等操作。
    Aggregation.lookup(): 连表查询,将被关联集合添加到执行操作的集合中。

mongodb:

db.getCollection('mro_fn_subscribes').aggregate([
    {
        $group:{
        "_id":{"_id":"$accountId", "status": "$status" },
        "count":{"$sum": NumberInt(1)},
        "statusSum":{"$sum": "$status"},
        "codeAvg":{"$avg":"$fnCode"},
        "codeMax":{"$max":"$fnCode"},
        "codeMin":{"$min":"$fnCode"},
        "codeFirst":{"$first":"$fnCode"},
        "codeLast":{"$last":"$fnCode"},
        }
        
    }
])

java:

Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.group("accountId", "status")
                .count().as("count")
                .sum("status").as("statusSum")
                .avg("fnCode").as("codeAvg")
                .max("fnCode").as("codeMax")
                .min("fnCode").as("codeMin")
                .first("fnCode").as("codeFirst")
                .last("fnCode").as("codeLast")
);

match管道过滤:

mongodb:

db.getCollection('mro_fn_subscribes').aggregate(
  {$match:{userId:"a"}}
)

java:

Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(new Criteria().and("userId").is("a")
);

project筛选字段:

mongo:

db.getCollection('mro_fn_subscribes').aggregate([
    {
        "$group" : {
            "_id" : "$_id", 
            "num" : {
                "$sum" : "$num"
            }, 
            "firstName" : {
                "$first" : "$name"
            }, 
            "lastName" : {
                "$last" : "$name"
            }
        }
    }, 
    {
        "$project" : {
            "_id" : 1, 
            "num" : 1, 
            "firstName" : 1, 
            "name" : "$lastName"
        }
    }
])

java:

// 初始化聚合
Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.group(new String[] {"_id"}).sum("num").as("num")
	    	.first("name").as("firstName")
	    	.last("name").as("lastName"),
	Aggregation.project("_id", "num", "firstName")
                .and("lastName").as("name") // 重新命名字段
);

unwind拆分数组

mongo:

db.col.aggregate(
  {
    $match:{userid:"a"}
  }, 
  {
    $unwind:{
      path:"$items", includeArrayIndex: "arrayIndex"
    }
  }
)

java:

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(new Criteria().and("userId").is("a"),
    Aggregation.unwind("items",true)
);

sort skip limit处理数据

Mongo:

db.getCollection('mro_fn_subscribes').aggregate([
    {
        "$group" : {
             _id:{"_id":"$accountId", "status": "$status" } 
        }
    }, 
    {
        "$sort" : {
            "num" : -1
        }
    }, 
    {
        "$skip" : NumberInt(10)
    }, 
    {
        "$limit" : NumberInt(2)
    }
]
)

Java:

Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.group("accountId", "status")
	Aggregation.sort(Direction.DESC, "num"),		//将num降序
	Aggregation.skip(10),					//从第10条记录开始
	Aggregation.limit(2)					//取两条数据
);

lookup多表关联查询:

Mongo:

db.getCollection('mro_accounts').aggregate([
    {
        $lookup: {
            from:"mro_profiles",   # 被关联表名
            localField:"userName", # 主表(mro_accounts)中用于关联的字段
            foreignField:"mobile", # 被关联表(mro_profiles)中用于关联的字段
            as:"profileDoc"        # 被关联的表的别名
            }
        }
])

Java

Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.lookup("mro_profiles", "userName", "mobile", "profileDoc") //分别对应from, localField, foreignField, as
);

获取查询结果

创建好Aggregation对象之后

再用 mongotemplate.aggregate(aggregation, "mro_fn_subscribes", Fnsubscribe.class).getMappedResults() 获取查询的对象列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值