首页 > 数据库技术 > 详细

spring-data-mongodb 使用原生aggregate语句(更新中)

时间:2018-11-12 22:39:03      阅读:398      评论:0      收藏:0      [点我收藏+]

除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0.6


   考虑到大多数人都是来找答案的,所以先给出结论

// import org.springframework.data.mongodb.core.MongoTemplate;
mongoTemplate.getDb().doEval("db.user.aggregate([{$group:{_id:‘$name‘,count:{$sum:‘$age‘}}}])");

注意:

  1、mongo shell 使用js语法,可以使用单引号或者双引号表示字符串,这里使用单引号,可以避免大量的 \ 转义符

  2、原生语句中的key:value部分,value只能是 [xxx] 、{xxx} 、 ‘xxx’ 三种格式的数据。

  新版本的spring-data-mongodb已经去掉了doEval方法,我们可以使用下面的方法自己拼接

//spring-boot-starter:2.1.0.RELEASE spring-data-mongodb:2.1.2.RELEASE
BasicDBObject bson = new BasicDBObject();
bson.put("$eval","db.user.aggregate([{$group:{_id:‘$name‘,count:{$sum:‘$age‘}}}])");
Object object = mongoTemplate.getDb().runCommand(bson);

  其他的解决方法,如调用存储过程、拼接完整的BasicDBObject、继承Aggregate请见第三章:SPRING-DATA-MONGODB底层与MONGO-DRIVER的交互


 

  研究这个是因为遇到了一个业务需求,需要使用多种限制条件,返回多个统计字段。spring-data-mongodb提供的API不足以实现这么复杂的业务,所以就想到了直接使用原生的aggregate查询。

  mongo底层实现查询的方法主要有两种,一种是 db._collection_.doSomething({ ... }) ,另一种是db.runCommand({doSomething:_collection_ , ... }) ,我们将第一种称作函数,第二种称作命令

  那么,哪种才是 aggregate的原生查询?spring-data-mongodb底层究竟调用的是函数还是命令?如果你只是想完成工作的话,copy上面的代码,然后右上角点×,如果你想解决问题学点东西的话,欢迎继续看下去


  一:spring-data-mongodb 使用原生aggregate语句

  二:mongo的runCommand与集合操作函数的关系

  三:spring-data-mongodb底层与mongo-driver的交互

  四:mongo中的特殊集合$cmd

spring-data-mongodb 使用原生aggregate语句(更新中)

原文:https://www.cnblogs.com/ttjsndx/p/9942776.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!