mongoTemplate学习笔记
mongoTemplate的andExpression表达式
Aggregation<Post> agg = Aggregation.newAggregation(
Record.class,
match(Criteria.where("createAt").gte(startAt).lte(endAt)),
project().andExpression("{$dateToString:{format:'%Y-%m-%d',date: {$add:{'$createAt',8*60*60000}}}}").as("createAt")
,group( "createAt").count().as("totalNum")
,sort(Sort.Direction.DESC, "createAt")
);
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(agg, BasicDBObject.class);
List<BasicDBObject> results = result.getMappedResults();
mongoTemplate中的project()的用法,和previousOperation()的用法
https://blog.csdn.net/hotdust/article/details/52605990
最近使用Spring-Data-Mongodb的API来改写原来的代码,遇到了一些问题,先把自己学到的一些东西总结下来。
参考:
http://www.cnblogs.com/ontheroad_lee/p/3756247.html (这个文章特别好,很少有中文的关于Spring-Data-Mongodb的API的例子的介绍)
http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation.examples.example6 (官方文档)
1,project("name", "netPrice")
project方法的内容是你要映射的字段,相当于{$project: {sumfavour: 1, userid: 1}}。“映射”的意思,就是要显示哪个字段,或者把某个字段内容进行处理后显示。
2,project().and("foo").as("bar")
如果你想要把一个字段映射成别一个名字的话,就可以用上面的方法,相当于{$project: {bar: $foo}}
3,project("a","b").and("foo").as("bar")
这个方法相当于上面两个方法的结合{$project: {a: 1, b: 1, bar: $foo}}。如果单独使用and(),后面不使用as()的话,没有任何效果,也不会出错。
4,project().and("_id").plus(100000000).as("statusid")
这个语句的意思是,把_id字段加上100000000,再重新命名为"statusid"然后输出。
5,关于previousOperation()方法
Aggregation agg = newAggregation(
    project("tags"),
    unwind("tags"),
    group("tags").count().as("n"),
    project("n").and("tag").previousOperation(),
    sort(DESC, "n")
);
这段代码中主要讲的是previousOperation()方法的使用,想知道其它语句的含义,请参考官网文章介绍。说previousOperation之前要先说说Group语句,这里的Group语句的作用是,按“tags”字段进行分组,然后统计每个分组中的数据个数,统计的个数字段命名为“n”。输出的结果为(这里只为粘贴了所有数据中的一条):
{
"_id" : "627",
"n" : NumberInt(16)
}
project语句的作用是,把新生成的字段”n“做为结果输出,并且”_id“列重新命名为”tag“,然后也做为结果输出,最后结果为:
{
"tag" : "627",
"n" : NumberInt(16)
}
看完结果后,我们来说一下previousOperation()的作用。previousOperation()就是把“上一次操作的结果中”的_id字段,命名为它前面and()中的名称。所以它一般都是和and()结合使用。关于Group操作后,_id的内容的介绍,请看最下面的“关于_id字段”说明。
6,
- TypedAggregation<ZipInfo> aggregation = newAggregation(ZipInfo.class,
 - group("state","city")
 - .sum("population").as("pop"),
 - sort(ASC,"pop","state","city"),
 - group("state")
 - .last("city").as("biggestCity")
 - .last("pop").as("biggestPop")
 - .first("city").as("smallestCity")
 - .first("pop").as("smallestPop"),
 - project()
 - .and("state").previousOperation()
 - .and("biggestCity")
 - .nested(bind("name","biggestCity").and("population","biggestPop"))
 - .and("smallestCity")
 - .nested(bind("name","smallestCity").and("population","smallestPop")),
 - sort(ASC,"state")
 - );
 
通过nested()方法,可以把输出的结果变成嵌套格式,例如:
"object":{ "fieldA":"valueA","fieldB":"valueB"}
bind()方法是用通过已经存在的字段,来生成新的字段。例如
and("biggestCity").nested(bind("newField", "existField"))
7,
- TypedAggregation<Product> agg = newAggregation(Product.class,
 - project("name","netPrice")
 - .and("netPrice").plus(1).as("netPricePlus1")
 - .and("netPrice").minus(1).as("netPriceMinus1")
 - .and("netPrice").multiply(1.19).as("grossPrice")
 - .and("netPrice").divide(2).as("netPriceDiv2")
 - .and("spaceUnits").mod(2).as("spaceUnitsMod2")
 - );
 
可以在映射完某个字段后,还可以对字段进行加减乘除。
8,
- TypedAggregation<Product> agg = newAggregation(Product.class,
 - project("name","netPrice")
 - .andExpression("netPrice + 1").as("netPricePlus1")
 - .andExpression("netPrice - 1").as("netPriceMinus1")
 - .andExpression("netPrice / 2").as("netPriceDiv2")
 - .andExpression("netPrice * 1.19").as("grossPrice")
 - .andExpression("spaceUnits % 2").as("spaceUnitsMod2")
 - .andExpression("(netPrice * 0.8 + 1.2) * 1.19").as("grossPriceIncludingDiscountAndCharge")
 - );
 
还可以用andExpression()方法,使用一些mongo中的函数,例如:substr等。更重要的一点,还可以使用SpringSpEL表达式。上面的例子就是使用了表达式。下面是使用和不使用表达式的例子:
使用表达式:
  1+(q +1)/(q -1)
不使用表达式:
- {"$add":[1,{
 - "$divide":[{
 - "$add":["$q",1]},{
 - "$subtract":["$q",1]}
 - ]
 - }]}
 
而且,而且,在表达式内部还可以设置用外部变量进行替换。
- TypedAggregation<Product> agg = newAggregation(Product.class,
 - project("name","netPrice")
 - .andExpression("(netPrice * (1-discountRate) + [0]) * (1+taxRate)", shippingCosts).as("salesPrice")
 - );
 
[0]的位置,就会被后面的shippingCosts参数的内容给替换。
关于_id字段
_id字段是插入到数据库时自动生成的。在使用Group等聚合操作后,_id的内容会随着变化。例如:
1,{$group:{_id:'$statusid', sumfavour:{$sum:1}}}
这个语句的意思是,按照statusid字段进行分组,并统计每个分组的数据个数,被统计的个数字段命名为“sumfavour”。
从下面的输出的内容可以看到,_id内容就是statusid字段的内容。
{ 
    "sumfavour" : NumberInt(16), 
    "statusid" : "627"
}
2,{$group:{_id:{'statusid':'$statusid','userid':'$userid'}, sumfavour:{$sum:1}}}
这个语句的意思是按两个字段的内容进行排序。当以两个或以上的字段进行分组时,必须这么写,下面的例子都是错误的:
X:$group:{_id:{'$statusid','$userid'}}
X:$group:{_id:{'statusid','userid'}}
从这次分组完后的内容可以看到,_id的内容是statusid和userid两个字段的内容的组合。
{ 
    "_id" : {
        "statusid" : NumberInt(538), 
        "userid" : NumberInt(416347)
    }, 
    "sumfavour" : NumberInt(1)
}
可以看出_id字段
mongoTemplate学习笔记的更多相关文章
- SpringBoot学习笔记(十一:使用MongoDB存储文件 )
		
@ 目录 一.MongoDB存储文件 1.MongoDB存储小文件 2.MongoDB存储大文件 2.1.GridFS存储原理 2.2.GridFS使用 2.2.1.使用shell命令 2.2.2.使 ...
 - js学习笔记:webpack基础入门(一)
		
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
 - PHP-自定义模板-学习笔记
		
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
 - PHP-会员登录与注册例子解析-学习笔记
		
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
 - 2014年暑假c#学习笔记目录
		
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
 - JAVA GUI编程学习笔记目录
		
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
 - seaJs学习笔记2 – seaJs组建库的使用
		
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
 - CSS学习笔记
		
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
 - HTML学习笔记
		
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
 
随机推荐
- hibernate课程 初探单表映射2-7 hbm配置文件常用设置
			
本节主要简介hbm配置文件以下内容: 1 mapping标签 2 class标签 3 id标签 1 hibbernate-mapping标签 schema 模式名称 catalog 目录名称 defa ...
 - Visual Studio 2010 vs2010 英文版 使用 已有的中文版 MSDN 帮助文档
			
第一步 设置Help Library Manager区域语言 打开Microsoft Visual Studio 2010开始菜单里Visual Studio Tools里的Manage Help S ...
 - Android 从零开始搭建一个主流项目框架—RxJava2.0+Retrofit2.0+OkHttp
			
我这里的网络请求是用的装饰者模式去写的,什么是装饰者模式呢?在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.我的理解就是一个接口, ...
 - python3基础06(随机数的使用)
			
#!/usr/bin/env python# -*- coding:utf-8 -*- import osimport randomimport string la=[0,1,2,3,4,5,6,7, ...
 - COGS 1365. [HAOI2013] 软件安装
			
★★☆ 输入文件:haoi13t4.in 输出文件:haoi13t4.out 简单对比时间限制:1 s 内存限制:128 MB Dr.Kong有一个容量为N MB (1 <= N ...
 - HDU1430 BFS + 打表 + 康托展开
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完 ...
 - JSP开发过程遇到的中文乱码问题及解决方案
			
对于程序猿来说,乱码问题真的很头疼,下面列举几种常见的乱码. 1.数据库编码不一致导致乱码 解决方法: 首先查看数据库编码,输入: show variables like "%char%&q ...
 - iOS 真机报错 Command CodeSign failed with a nonzero exit code
			
今天在网上下载的一个小demo,在模拟器上正常运行,但是在真机上报错: 解决方式: 1.打开钥匙串:2.锁住login keychain: 3.再把它解锁. 然后就能真机上正常运行了,
 - kafka 开机启动脚本
			
/etc/init.d$ vi kafka-start-up.sh #!/bin/bash #export KAFKA_HOME=$PATH export KAFKA_HOME=/opt/Kafka/ ...
 - 2018.5.25 Oracle相关的函数命令
			
第03章 函数 1 Oracle的函数 Oracle的函数和java中的方法一样, 能完成一定的功能 2 字符处理类函数 --需求1:把ename字段转换成小写 select lower(ename) ...