mongdb 的数据介绍:
系统有多个用户,contractId 代表用户Id,其中 serialno 也是一种 id,代表该客户登录系统的编号,该 contractId 每次登录系统都会产生不同的 serialno,但同一次登录都会产生不同的数据,也就是如下数据会产生多条,stepCode 不一样, key 和value也不一样。stepCode最大时,也会有多条记录。
{
    "_id": "5bf246ab51b7a735d7648224",
    "serialno": "2018111100000001",
    "create_time": 1542596328797,
    "contractId": "F1011111111011111",
    "createTime": "2018-11-11 11:11:11 111",
    "id": 0,
    "key": "APPINFO",
    "loanChannel": "R000",
    "stepCode": 11,
    "value": {
        "a_car_price": 0,
        "a_car_price_change": 0,
        "a_carloan_amount": 11000,
        "a_com_fee": 1100,
        "a_com_rate": 1111,
        "a_init_payment": 1111,
        "a_init_scale": 11.11,
        "a_loan_amount": 11110,
        "a_loan_periods": 11,
        "a_loan_rate": 1.1,
        "a_secure_fee": 100
    },
    "local_create_time": "2018-11-11T11:11:11.111+08:00"
}
 
 
查询目标说明
要求查询所有用户,每次登录系统时serialno,最后一次登录的状态,也就是的 stepcode最大时的多条记录。
 
 
方法技巧:
  1. 利用聚合Pipeline的多次筛选:$match 和 $project
  2. 利用 groupby + push + unwind,实现了本表的 join 操作
  3. 利用 unwind 解开了 push
  4. 利用 project 实现了增加状态位字段, 辅助复杂筛选条件的实现
  5. 利用 project 进行字段的筛选
  6. 最终合并同一个合同的数据结果

db.c_engine_col.aggregate(
[
{"$match":{"local_create_time" : {"$gt":"2018-11-10", "$lt":"2018-11-20"}}}, // 筛选条件
{
"$group":{"_id":"$serialno", "maxstep":{"$max":"$stepCode"}, "keys":{"$push":"$$ROOT"}} // 分组计算 maxstep, 并合并所有数据
},
{"$unwind":"$keys"}, // 解开数据
{"$project":{"_id":1, "maxstep":1, "keys.key":1, "keys.serialno":1, "keys.stepCode":1, "keys.value":1, "diff":{"$eq":["$maxstep","$keys.stepCode"]}}}, // 增加状态位
{"$match":{"diff":true}}, // 根据状态位筛选 stepcode==maxstep
{"$project":{"_id":1,"keys.serialno":1 , "keys.key":1, "keys.stepCode":1, "keys.value":1}}, // 提取少量字段
{
"$group":{"_id":"$keys.serialno", "key_value_arr":{"$push": "$$ROOT"} } // 并合并所有筛选后的数据
}
])
 

mongodb 复杂查询之 本表 join的更多相关文章

  1. distinct 去重复查询——两个表join 连接,去掉重复的数据

    ------distinct 去重复查询 select * from  accounts acc join (select distinct accid from roles) r on r.acci ...

  2. 数据库(学习整理)----7--Oracle多表查询,三种join连接

    聚合函数:(都会忽略null数据) 常用的有5种:将字段中所有的数据聚合在一条中 .sum(字段名) :求总和 .avg(字段名) :求平均值 .max(字段名) :求最大值 .min(字段名) :求 ...

  3. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  4. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  5. 使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。

    这里一句代码就是查询2个表中某一列的相同,可是查询出来之后B表因为有很多重复的id数据,然而查询出来的数据需要插入到临时表中,临时表的oid是不允许有重复的, 因此需要用到 distinct 函数来取 ...

  6. 使用c#对MongoDB进行查询(1)

    1.BsonDocument对象 在MongoDB.Bson命名空间下存在一个BsonDocument类,它是MongoDB的文档对象,代表着MongoDB中不规则数据一条条实体模型.可以使用Bson ...

  7. 怎么对10亿数据量级的mongoDB作高效的全表扫描

    转自:http://quentinxxz.iteye.com/blog/2149440 一.正常情况下,不应该有这种需求 首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提 ...

  8. mongodb 复杂查询

    记录一下工作中用到的 mongodb 复杂查询 aggregate 筛选 === 等于 { $match: { name: "bob" } } !== 不等于 { $match: ...

  9. 工作随笔——mysql子查询删除原表数据

    最近在开发的时候遇到一个mysql的子查询删除原表数据的问题.在网上也看了很多方法,基本也是然并卵(不是写的太乱就是效率太慢). 公司DBA给了一个很好的解决方案,让人耳目一新. DELETE fb. ...

随机推荐

  1. python-飞机大战

    效果图 main.py import time import pygame from EnemyPlane import EnemyPlane from HeroPlane import HeroPl ...

  2. apache环境配置 | httpd Could not reliably determine the server's fully qualified domain name

    apache环境配置 | httpd Could not reliably determine the server's fully qualified domain name    转 https: ...

  3. HDU 5536 Chip Factory (暴力+01字典树)

    <题目链接> 题目大意: 给定一个数字序列,让你从中找出三个不同的数,从而求出:$\max_{i,j,k} (s_i+s_j) \oplus s_k$的值. 解题分析:先建好01字典树,然 ...

  4. HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】

    <题目链接> 题目大意: 动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些动物.假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy. ...

  5. HttpServletRequestWrapper使用技巧(自定义session和缓存InputStream)

    一.前言 javax.servlet.http.HttpServletRequestWrapper 是一个开发者可以继承的类,我们可以重写相应的方法来实现session的自定义以及缓存InputStr ...

  6. xss小结-从xss平台搭建到csp规则

    0x00前言 xss是跨站脚本攻击,利用嵌入js代码达到‘控制’对方浏览器的作用,测试的时候我们是用alert(1)弹窗,而做CTF也好,实际中的漏洞利用也好一般是用xss获取管理员的cookie 0 ...

  7. oracle 重复只保留一条

    DELETE FROM xx WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM xx  GROUP BY xx, xx);

  8. jmeter使用Beanshell预处理器从指定列表中获取随机值

    变量mynation从列表{"china", "US", "UK"}中随机取值 String[] nation = new String[] ...

  9. Nginx 反向代理 -- 一路上的坑

    前些天刚过来新公司上班,公司的项目都挺多的,只不过项目都是第三方公司团队开发的,现在本公司要组建自己的团队,我作为一个Java后台人员去接手第三方公司的全部项目,我已经是直接崩溃了(先解释一下我崩溃的 ...

  10. ES6快速入门(一)函数与作用域

    ES6快速入门 一.块级绑定 1.var声明与变量提升 使用var声明的变量,不论在何处都会被视为(声明)在函数级作用域顶部的位置发生. function getValue(condition) { ...