最近使用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()的用法相关推荐

  1. Spring Data MongoDB中的审核实体

    Spring Data MongoDB 1.2.0静默引入了新功能:支持基本审核 . 因为您不会在本文的官方参考中找到太多有关它的信息,所以我将展示它带来的好处,如何配置Spring以进行审计以及如何 ...

  2. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客

    前言:在上一篇文章中(PS:https://www.zifangsky.cn/923.html)我简单介绍了如何在Linux中安装MongoDB以及MongoDB的增删改查等基本命令用法(PS:更多M ...

  3. 数据聚合Spring Data MongoDB:嵌套结果

    1引言 在上一篇文章中,我们构建了聚合管道的基本示例. 如果您需要有关如何创建项目和配置应用程序的更多详细信息,也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚 ...

  4. Spring Data MongoDB示例

    Spring Data MongoDB示例 欢迎使用Spring Data MongoDB示例.Spring Data MongoDB是将Spring Framework与最广泛使用的NoSQL数据库 ...

  5. SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解

    一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...

  6. Spring认证中国教育管理中心-Spring Data MongoDB教程五

    原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...

  7. Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计

    Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计 先简单交代一下需求:新高考政策下,高中学生可以组合选择自己喜欢的三门副科,选科结束后教务需要看到这次选科 ...

  8. mongodb数据库java接口,MongoDB —— 使用Spring Data MongoDB操作数据库

    我们使用Spring Data MongoDB可以方便的在Spring boot项目中操作MongoDB 文档地址:https://docs.spring.io/spring-boot/docs/2. ...

  9. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  10. Spring Data MongoDB教程

    在当今世界,尽快启动并运行应用程序非常重要. 该应用程序还应该易于开发和维护. Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易. 一种这样的 ...

最新文章

  1. Windows Server基础架构云参考架构:硬件之上的设计
  2. CSDN Blog V3.0.0.2升级公告
  3. C++ cin不支持录入空格
  4. 如何在Spyder中运行spark
  5. centos下 keepalived1.2.8配置文件
  6. 推荐系统中的长尾物品(Tail Items)推荐问题
  7. nginx服务器的文件大小的限制解决方法
  8. 求圆和椭圆上任意角度的点的坐标
  9. 联想(Lenovo)小新310经典版进bios方法
  10. 一个简易的反射类库NMSReflector
  11. kotlin 查找id_Kotlin程序查找Square区域
  12. Javascript事件绑定this
  13. 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)
  14. Vue组件化之VueComponent介绍
  15. unity 学习记录
  16. MongoDB compass 连接不上远程服务器的解决方法
  17. 你为什么人到中年还是个普通员工?
  18. 小米Airdots 充电盒拆机
  19. 八、线性规划 顶点、极值点和基本可行解决方案
  20. Boot Option中没有USB启动选项的解决办法

热门文章

  1. 视频的格式也支持批量消音?一学就会
  2. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第6章 集合
  3. 计算机无法加入域请确保域名,计算机无法加入域的终级解决方法
  4. 【转】2012年6月26 – 盛大PHP工程师最新面试题
  5. USB媒体设备端口绑定(以海康会议摄像头为例)
  6. 前端实现点击弹出视频展示模块
  7. 运营商最新号码段 以及 手机号码的正则表达式判断
  8. web.py——简单而且功能强大的Python web 框架(4):生成表单、获取输入和内容的验证
  9. 提高移动电子商务销售的交互设计模式
  10. Android组件之Service 与常用系统服务用法详解