尽量别直接用 DBObject  ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累

Spring data mongodb 唯一好处就是,不需要自己decode encode,其他别的几乎也没了

DBObject project = new BasicDBObject("$project", new BasicDBObject("_id", 1)
.append("..", "$..").append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1).append("..", 1)
.append("..", 1)); query.add(project);
query.add(new BasicDBObject("$unwind", "$..."));
query.add(new BasicDBObject("$skip",...));
query.add(new BasicDBObject("$limit",...));
AggregationOutput aggregationOutput = mongoTemplate.getCollection("...").aggregate(query);

以下使用Spring data mongodb 做聚合,内嵌文档分页,订单 - 明细 一对多的例子

package com.example.mongo.entity;

import lombok.Data;
import lombok.experimental.Accessors;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id; import java.io.Serializable;
import java.util.List; /**
* Created by laizhenwei on 2017/11/9
*/
@Data
@Accessors(chain = true)
public class Order implements Serializable { private static final long serialVersionUID = 4738576111790390042L; @Id
private ObjectId objectId; private List<Detail> details; /**
* 企业编号
*/
private String compyCode; /**
* 订单号
*/
private String orderNo; /**
* 用户名
*/
private String userName; }

明细实体

package com.example.mongo.entity;

import lombok.Data;
import lombok.experimental.Accessors;
import org.bson.types.ObjectId; import java.io.Serializable;
import java.math.BigDecimal; /**
* Created by laizhenwei on 2017/11/9
*/
@Data
@Accessors(chain = true)
public class Detail implements Serializable { private static final long serialVersionUID = 942116549431791887L; private ObjectId id; /**
* 商品名称
*/
private String productName; /**
* 商品数量
*/
private Long itemQty; /**
* 单价
*/
private BigDecimal price; }

Junit

package com.example.mongo.Repository;

import com.example.mongo.entity.Detail;
import com.example.mongo.entity.Order;
import com.mongodb.BasicDBList;
import com.mongodb.DBObject;
import lombok.Data;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.test.context.junit4.SpringRunner; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional; import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.limit;
import static org.springframework.data.mongodb.core.query.Criteria.where; /**
* Created by laizhenwei on 2017/11/9
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderTests { @Autowired
private OrderRepository orderRepository; @Autowired
private MongoTemplate mongoTemplate; private String[] compyCode = {"123123", "456456", "789789"}; private String[] userNames = {"Athos", "Peter", "Nero", "Gavin", "Carter"}; /**
* 造一点数据
*/
@Test
public void save() {
List<Order> orders = new ArrayList<>(200);
for (int i = 0; i < 200; i++) {
List<Detail> details = new ArrayList<>(3);
for (int j = 0; j < 3; j++) {
Detail detail = new Detail();
detail.setId(new ObjectId());
detail.setItemQty((long) (i + 1));
detail.setProductName("产品" + i + "_" + j);
detail.setPrice(new BigDecimal(10 + i));
details.add(detail);
}
Order order = new Order();
order.setCompyCode(compyCode[i % 3]);
order.setUserName(userNames[i % 5]);
order.setOrderNo(String.valueOf(i));
order.setDetails(details);
orders.add(order);
}
orderRepository.insert(orders);
} /**
* 内嵌文档分页查询
*/
@Test
public void pageQuery() {
Detail detailDto = new Detail(); detailDto.setProductName("产品19_0"); List<AggregationOperation> commonOperations = new ArrayList<>(9);
commonOperations.add(project("objectId", "details", "compyCode", "orderNo", "userName").and("details").as("detail"));
Optional.ofNullable(detailDto.getProductName()).ifPresent(s -> commonOperations.add(match(where("details.productName").is(detailDto.getProductName()))));
commonOperations.add(unwind("detail")); List<AggregationOperation> pageOperations = new ArrayList<>(commonOperations);
pageOperations.add(skip(1l));
pageOperations.add(limit(10)); List<AggregationOperation> totalAggOperation = new ArrayList<>(commonOperations);
totalAggOperation.add(group().count().as("total")); List<DetailVo> results = mongoTemplate.aggregate(Aggregation.newAggregation(Order.class,pageOperations), Order.class, DetailVo.class).getMappedResults(); System.out.println(results.size()); DBObject rawResults = mongoTemplate.aggregate(Aggregation.newAggregation(Order.class,totalAggOperation), String.class).getRawResults();
BasicDBList result = (BasicDBList)rawResults.get("result");
long total = result.isEmpty() ? 0 : Long.parseLong(((DBObject)result.get(0)).get("total").toString()); System.out.println("total:" + total);
} /**
* 结果实体
*/
@Data
private static class DetailVo{
@Id
private ObjectId orderId;
private Detail detail;
private String compyCode;
private String orderNo;
private String userName;
} }

logback 打开 方便观察

<Logger name="org.mongodb.driver" level="debug" />
<logger name="org.springframework.data.mongodb.core.MongoTemplate" level="debug" /> 控制台输出,只取重点,因为skip 了一个,所以结果只有2个,总数量是3个
13:45:31.740 logback [main] DEBUG o.s.data.mongodb.core.MongoTemplate - Executing aggregation: { "aggregate" : "order" , "pipeline" : [ { "$project" : { "objectId" : "$_id" , "details" : 1 , "compyCode" : 1 , "orderNo" : 1 , "userName" : 1 , "detail" : "$details"}} , { "$match" : { "details.productName" : "产品19_0"}} , { "$unwind" : "$detail"} , { "$skip" : 1} , { "$limit" : 10}]}
13:45:31.743 logback [main] DEBUG o.s.data.mongodb.core.MongoDbUtils - Getting Mongo Database name=[e9]
13:45:31.752 logback [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2}] to 192.168.1.9:27023
13:45:31.756 logback [main] DEBUG org.mongodb.driver.protocol.command - Sending command {aggregate : BsonString{value='order'}} to database e9 on connection [connectionId{localValue:2}] to server 192.168.1.9:27023
13:45:31.759 logback [main] DEBUG org.mongodb.driver.protocol.command - Command execution completed
13:45:31.765 logback [main] DEBUG o.s.d.m.c.i.MongoPersistentEntityIndexCreator - Analyzing class class com.example.mongo.Repository.OrderTests$DetailVo for index information.
2
13:45:31.780 logback [main] DEBUG o.s.data.mongodb.core.MongoTemplate - Executing aggregation: { "aggregate" : "order" , "pipeline" : [ { "$project" : { "objectId" : "$_id" , "details" : 1 , "compyCode" : 1 , "orderNo" : 1 , "userName" : 1 , "detail" : "$details"}} , { "$match" : { "details.productName" : "产品19_0"}} , { "$unwind" : "$detail"} , { "$group" : { "_id" : null , "total" : { "$sum" : 1}}}]}
13:45:31.780 logback [main] DEBUG o.s.data.mongodb.core.MongoDbUtils - Getting Mongo Database name=[e9]
13:45:31.780 logback [main] DEBUG org.mongodb.driver.protocol.command - Sending command {aggregate : BsonString{value='order'}} to database e9 on connection [connectionId{localValue:2}] to server 192.168.1.9:27023
13:45:31.782 logback [main] DEBUG org.mongodb.driver.protocol.command - Command execution completed
total:3

												

Spring data mongodb 聚合,投射,内嵌数组文档分页.的更多相关文章

  1. mongodb.mongoose维护内嵌数组元素

    运行环境: - Nodejs - MongoDB 文档实例名: ProjectJob 文档格式如下: { "_id" : ObjectId("5bc69eb0b298b3 ...

  2. 微信小程序内嵌网页能力开放 小程序支持内嵌网页文档说明

    为了方便开发者灵活配置微信小程序,张小龙现在开放了小程序的内嵌网页功能,这是一个非常大的惊喜啊,以后意味着你只要开放一个手机端网站,就可以制作一个小程序了哦.操作方法1.开发者登录微信小程序后台,选择 ...

  3. MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))

    目录 一.前言 1. 运行环境 二.前期准备工作 1. 创建 MongoDBContext MongoDb操作上下文类 2.创建测试类 3.创建测试代码 三.内嵌数组增加元素操作 1.Update.S ...

  4. MongoDB查询内嵌数组(限定返回符合条件的数组中的数据)(1)

    https://blog.csdn.net/bicheng4769/article/details/79579830 项目背景 最近在项目中使用mongdb来保存压测结果中的监控数据,那么在获取监控数 ...

  5. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)

    一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

  6. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  7. spring data mongodb CURD

    一.添加 Spring  Data  MongoDB 的MongoTemplate提供了两种存储文档方式,分别是save和insert方法,这两种的区别: (1)save :我们在新增文档时,如果有一 ...

  8. Spring Data MongoDB 四:基本文档改动(update)(一)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data  Mo ...

  9. spring data mongodb 配置遇到的几个问题

    一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...

随机推荐

  1. List迭代过滤操作注意点

    今天在写一段很简单的代码,本来以为肯定没什么问题,然后直接跑的时候,吆,简单的一个List的操作报错了.仔细一看代码,确实有问题,但是一般真的是如果稍微不小心就会犯下面这种愚蠢的操作. 这里我把代码贴 ...

  2. hibernate 基础

    Hibernate:是开源的ORM框架技术,对jdbc进行了非常轻量级的对象封装,处于业务逻辑层和数据库层之间,称作持久化层. 持久化层的作用:把程序生成的对象持久化到数据库,也就是保存到数据库.   ...

  3. Linux系统中调用短信猫发送短信(笔记)

    1, 拷贝底层串口依赖的librxtxSerial.so到JDK安装路径cp librxtxSerial.so /usr/java/{0}/jre/lib/{1} # {0}: JDK的基础目录,例如 ...

  4. join on用法

    内连接和外连接 内连接用于返回满足连接条件的记录:而外连接则是内连接的扩展,它不仅会满足连接条件的记录,而且还会返回不满足连接条件的记录 内连接 内连接查询返回满足条件的所有记录,默认情况下没有指定任 ...

  5. wamp图标为黄色(非端口号问题)

    1.Win键+R 输入:services.msc  进入服务,找到wamp,看哪个服务没有启动 2.手动启动apache服务失败,弹出以下错误 3.然后在cmd命令行中切换到你的apache的bin目 ...

  6. lvs_nat

    nat模式环境模拟 1.实验环境概览 192.168.1.186 192.168.75.131 双网卡 dir 调度器(vip) ipvsadm,双网卡 192.168.1.185 单网卡 rs1 真 ...

  7. Prime - 程序员的修养

    求质数算法的N种境界 求质数算法的N种境界[1] - 试除法和初级筛法 过程 尽管题目并没有要我们写一个最优的算法,但是身为一个程序员,优化应该是一种习惯,在编程的过程中,随着思考进行优化. 如果你只 ...

  8. 蓝桥杯练习系统—基础练习 sine之舞

    题目:最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数,所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力. 不妨设 ...

  9. Linux普通用户使用sudo权限启停apache服务

    sudo的工作过程如下: 1,用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2,确认用户具有可执行sudo的权限后,让用户输入密码确认 3,若密码 ...

  10. AC 自动机 模板

    简单版 #include <iostream> #include <cstdio> #include <algorithm> #include <cstrin ...