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"} } // 併合並全部篩選後的數據
        }
    ])
相關文章
相關標籤/搜索