您可以先用“项目”来做这样的事情,但对我来说,这是一个有点反直觉,需要一个$项目的舞台:

Aggregation agg = newAggregation(

project("quantity")

.andExpression("dayOfMonth(date)").as("day")

.andExpression("month(date)").as("month")

.andExpression("year(date)").as("year")

.andExpression("price * quantity").as("totalAmount"),group(fields().and("day").and("month").and("year"))

.avg("quantity").as("averavgeQuantity")

.sum("totalAmount").as("totalAmount")

.count().as("count")

);

就像我所说的,反直觉,你应该能够宣布所有这些在$group阶段,但帮助者似乎不这样工作.序列化有点有趣(用数组包装日期操作符参数),但它似乎工作.但是,这是两个管道阶段,而不是一个.

这是什么问题?通过分阶段,“项目”部分强制处理流水线中的所有文档,以获得计算的字段,这意味着它在移动到组阶段之前通过所有的阶段.

通过以两种形式运行查询可以清楚地看到处理时间的差异.在单独的项目阶段,我的硬件执行时间要比在“组”操作期间计算所有字段的查询多三倍.

所以现在看来​​唯一正确的方法是通过自己建立管道对象:

ApplicationContext ctx =

new AnnotationConfigApplicationContext(SpringMongoConfig.class);

MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");

BasicDBList pipeline = new BasicDBList();

String[] multiplier = { "$price","$quantity" };

pipeline.add(

new BasicDBObject("$group",new BasicDBObject("_id",new BasicDBObject("month",new BasicDBObject("$month","$date"))

.append("day",new BasicDBObject("$dayOfMonth","$date"))

.append("year",new BasicDBObject("$year","$date"))

)

.append("totalPrice",new BasicDBObject(

"$sum",new BasicDBObject(

"$multiply",multiplier

)

))

.append("averageQuantity",new BasicDBObject("$avg","$quantity"))

.append("count",new BasicDBObject("$sum",1))

)

);

BasicDBObject aggregation = new BasicDBObject("aggregate","collection")

.append("pipeline",pipeline);

System.out.println(aggregation);

CommandResult commandResult = mongoOperation.executeCommand(aggregation);

或者如果所有这些似乎都简化了,那么你可以随时使用JSON源并解析.但当然,它必须是有效的JSON:

String json = "[" +

"{ \"$group\": { "+

"\"_id\": { " +

"\"month\": { \"$month\": \"$date\" }," +

"\"day\": { \"$dayOfMonth\":\"$date\" }," +

"\"year\": { \"$year\": \"$date\" } " +

"}," +

"\"totalPrice\": { \"$sum\": { \"$multiply\": [ \"$price\",\"$quantity\" ] } }," +

"\"averageQuantity\": { \"$avg\": \"$quantity\" }," +

"\"count\": { \"$sum\": 1 } " +

"}}" +

"]";

BasicDBList pipeline = (BasicDBList)com.mongodb.util.JSON.parse(json);

by mango怎么group_java – MongoDB中计算的group-by字段相关推荐

  1. db2数据库sql中计算两个时间字段的差值用到timestampdiff函数

    timestampdiff(2,char(timestamp(表.endTime)-timestamp(表.starteTime)))

  2. mongoDB中的聚合操作

    本文来说下mongoDB中的聚合操作 文章目录 概述 概述 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似 SQL 语句中的 ...

  3. sybase 事务 超时返回_事务背景介绍(2):MongoDB中的逻辑会话

    MongoDB中文社区(mongoing-mongoing) 摘要 通过创建逻辑会话,现在可以跟踪单操作事务或者包含多个操作的事务在整个系统中资源消耗情况.这样就可以简单地,精确地取消事务中的操作以及 ...

  4. 用Python向MongoDB中插入大csv文件

    需要的库 1.pymongo 2.csv 思路 1.连接MongoDB. 2.读取csv文件 3.csv文件的内容写入MongoDB. 代码 import pymongo import csv imp ...

  5. 如何使用MongoDB Go驱动程序在MongoDB中使用Go

    The author selected the Free Software Foundation to receive a donation as part of the Write for DOna ...

  6. SpringBoot/Java 将MongoDB中的数据转换为json文件

    项目背景: 我最近在做SpringBoot的项目,其中数据库使用的是MongoDB,前端框架用的是layui.在我使用layui的数据表格组件时,其数据接口对应的是json文件,所有我得将MongoD ...

  7. 一篇文章带你搞定 MongoDB 中 MapReduce 使用

    玩过 Hadoop 的小伙伴对 MapReduce 应该不陌生,MapReduce 的强大且灵活,它可以将一个大问题分解为多个小问题,将各个小问题发送到不同的机器上去处理,所有的机器都完成计算后,再将 ...

  8. MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)

    MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...

  9. mongoDB中聚合(aggregate)的具体使用

    mongoDB中聚合(aggregate)的具体使用 - 简书 最近在学习mongoDB的使用,本文来介绍一下其中aggregate的具体使用 先来看一个分组的例子,本例中$group是一个管道操作符 ...

最新文章

  1. 【Redis6快速深入学习01】NoSQL数据库简介
  2. 文件描述符与打开文件的关系
  3. .Net 中的反射(查看基本类型信息) - Part.2
  4. 阿里云飞天洛神2.0:高性能网络软硬一体化技术实践
  5. influxdb聚合函数JAVA_InfluxDB 聚合函数实用案例
  6. c语言窗口最大化,使用SDL处理最大化的窗口
  7. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析
  8. 归并python_python基本算法之实现归并排序(Merge sort)
  9. 数据分析过程注意事项
  10. [分析力学]解题思路 - 拉格朗日方程
  11. 思途旅游CMS短信宝短信插件
  12. libsvm嵌入式移植
  13. 腾讯-信鸽实现消息推送
  14. H5 + WebGL 展示的3D无人机
  15. 【WRC 大咖观点】张钹《人工智能与机器人》
  16. CNN已老,GNN来了!清华大学孙茂松组一文综述GNN
  17. 调查计算机用户体验,办公桌用户体验调查与分析
  18. 如何提取处理网页视频中的字幕
  19. 知识库系统源代码——信息新增、编辑以及展示源码
  20. 台湾新生产的电脑要兼容 Linux

热门文章

  1. matlab循环遍历数组_MatLab简易教程 #8 循环
  2. RTT内核对象——对象理解
  3. oracle01144,ORA-01144
  4. 《操作系统》——第一章 计算机系统概述
  5. android数据截取字符串数组,android - 从Android Studio中的字符串数组获取特定字符串 - SO中文参考 - www.soinside.com...
  6. Oracle-索引分裂研究
  7. 今晚直播丨手把手安装搭建GoldenDB
  8. 日均5亿查询量的京东订单中心,为什么舍MySQL用ElasticSearch?
  9. 未完待续:关于DB Link和SCN,你还需要知道的是...
  10. 基于Tensorflow + Opencv 实现CNN自定义图像分类