zoukankan      html  css  js  c++  java
  • mongodb 复杂查询之 本表 join

     
    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"} } // 并合并所有筛选后的数据
            }
        ])
     
  • 相关阅读:
    docker学习网址
    ubantu安装docker
    ssh查看自己的公钥
    Ubuntu 桥接设置 (在ubantu 18.04.5 之前好用 ,,,,18.04.5 就不好用了)
    学习地址
    MANO官网
    centos7 的防火墙 开放端口
    centos7安装arp-sacn (./configure make makeinstall)
    yum源-postgresql
    行拆分,列合并
  • 原文地址:https://www.cnblogs.com/ToDoToTry/p/10027217.html
Copyright © 2011-2022 走看看