关于Spring-Data-Mongodb中的project()的用法,和previousOperation()的用法
最近使用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字段
关于Spring-Data-Mongodb中的project()的用法,和previousOperation()的用法相关推荐
- Spring Data MongoDB中的审核实体
Spring Data MongoDB 1.2.0静默引入了新功能:支持基本审核 . 因为您不会在本文的官方参考中找到太多有关它的信息,所以我将展示它带来的好处,如何配置Spring以进行审计以及如何 ...
- mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客
前言:在上一篇文章中(PS:https://www.zifangsky.cn/923.html)我简单介绍了如何在Linux中安装MongoDB以及MongoDB的增删改查等基本命令用法(PS:更多M ...
- 数据聚合Spring Data MongoDB:嵌套结果
1引言 在上一篇文章中,我们构建了聚合管道的基本示例. 如果您需要有关如何创建项目和配置应用程序的更多详细信息,也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚 ...
- Spring Data MongoDB示例
Spring Data MongoDB示例 欢迎使用Spring Data MongoDB示例.Spring Data MongoDB是将Spring Framework与最广泛使用的NoSQL数据库 ...
- SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解
一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...
- Spring认证中国教育管理中心-Spring Data MongoDB教程五
原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...
- Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计
Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计 先简单交代一下需求:新高考政策下,高中学生可以组合选择自己喜欢的三门副科,选科结束后教务需要看到这次选科 ...
- mongodb数据库java接口,MongoDB —— 使用Spring Data MongoDB操作数据库
我们使用Spring Data MongoDB可以方便的在Spring boot项目中操作MongoDB 文档地址:https://docs.spring.io/spring-boot/docs/2. ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- Spring Data MongoDB教程
在当今世界,尽快启动并运行应用程序非常重要. 该应用程序还应该易于开发和维护. Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易. 一种这样的 ...
最新文章
- Windows Server基础架构云参考架构:硬件之上的设计
- CSDN Blog V3.0.0.2升级公告
- C++ cin不支持录入空格
- 如何在Spyder中运行spark
- centos下 keepalived1.2.8配置文件
- 推荐系统中的长尾物品(Tail Items)推荐问题
- nginx服务器的文件大小的限制解决方法
- 求圆和椭圆上任意角度的点的坐标
- 联想(Lenovo)小新310经典版进bios方法
- 一个简易的反射类库NMSReflector
- kotlin 查找id_Kotlin程序查找Square区域
- Javascript事件绑定this
- 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)
- Vue组件化之VueComponent介绍
- unity 学习记录
- MongoDB compass 连接不上远程服务器的解决方法
- 你为什么人到中年还是个普通员工?
- 小米Airdots 充电盒拆机
- 八、线性规划 顶点、极值点和基本可行解决方案
- Boot Option中没有USB启动选项的解决办法