簡體   English   中英

使用條件合並結果在 mongo 查詢中

[英]Merge results in mongo query with conditions

用例:

我有 n 個作業,我想合並這些作業的數據,這樣如果在 1 種情況下傳遞了對應子鍵的值,它應該將其標記為已通過。

例如 Job1 詳細 Object:

{"Name" : [{"No." : "119","Time" : "t"}],
"Results":[{**"K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : **"FAILED"**},
                                             {"Name" : "K13","Result" : **"PASSED"**}]
                    },
            "K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},              
                                            {"Name" : "K22","Result" : "PASSED"}]
                      
                    }
            
           ]
}

Job2詳細Object:

{"Name" : [{"No." : "120","Time" : "t1"}],
"Results":[{"**K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : **"PASSED"**},
                                             {"Name" : "K13","Result" : **"FAILED"**}]
                    },
            "K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},              
                                            {"Name" : "K32","Result" : "PASSED"}]
                      
                    }
            
           ]
}

預計 Output

{"Name" : [{"No." : "119-120","Time" : "lowest(t,t1)"}],
"Results":[{**"K1"** : {"Counters" : x, "TCR" : [{"Name" : "K11", "Result" : "PASSED"}, 
                                             {"Name" : "K12","Result" : **"PASSED"**},
                                             {"Name" : "K13","Result" : **"PASSED"**}]
                    },
            "K2" : {"Counters": y, "TCR" : [{"Name" : "K21","Result" : "PASSED"},              
                                            {"Name" : "K22","Result" : "PASSED"}]
                      
                    },
             "K3" : {"Counters": y, "TCR" : [{"Name" : "K31","Result" : "PASSED"},              
                                            {"Name" : "K32","Result" : "PASSED"}]
                      
                    }
            
           ]
}

解釋:

密鑰 k1 在兩個 dicts 中都是通用的,因此在 k1 內部,我們有密鑰 k12 和 k13,它們在一個中傳遞但在另一個中失敗。 因此,在預期的 output 中,我需要鍵 k1 和鍵 k12 和 k13 具有傳遞的值,因為它們在一種情況下被傳遞。 與此同時,K2 和 K3 將按原樣出現。

我達到了將相同的關鍵數據匯總在一行中的位置,但是如何進行進一步的比較。

查詢使用 -

aggregate([{$match: {
  $or:[{"Name.No":"119"},{"Name.No":"120"}]
}}, {$project: {
  x:{$objectToArray:"$Results"}
}},{$unwind: "$x"},{$group: {_id: "$x.k", distinctVals: {$addToSet: "$x.v.TCR"}}}])

名稱/結果字段是:
在 object 中
在一個數組中
嵌入在 object 中
嵌入在另一個 object 中
在一個數組中
嵌入文檔中。

那是很多層要剝。

所以要獲得名稱/結果對:

  • 展開文檔中的數組
  • 將嵌入對象轉換為 arrays
  • 展開轉換后的 arrays
  • 進入最后一個文檔並展開深度數組

然后將它們結合起來

  • 按名稱部分分組,將所有通過/失敗結果推送到數組中
  • 減少構造的數組以確定整體通過/失敗值
  • 按鍵(K1、K2 等)分組並將名稱/結果推送到數組中
  • 按 null 分組(即沒有制作單個文檔的組)將它們的鍵推入結果數組
  • 重構文檔結構

通過所有這些步驟,維護名稱和時間等全局字段。

這可能看起來像:

db.collection.aggregate([
  {$match: {"Name.No": {$in:["119","120"]}}},
  {$unwind: "$Results"},
  {$set: {
      Results: {$objectToArray: "$Results"}
  }},
  {$unwind: "$Results"},
  {$unwind: "$Results.v.TCR"},
  {$group: {
      _id: {
        resultKey: "$Results.k",
        TCRName: "$Results.v.TCR.Name"
      },
      Result: {$push: "$Results.v.TCR.Result"},
      Counters: {$first: "$Results.v.Counters"},
      No: {$addToSet: "$Name.No"},
      Time: { $min: "$Name.Time"}
  }},
  {$set: {
      No: {
        $reduce: {
          input: "$No",
          initialValue: [],
          in: {$setUnion: ["$$value","$$this"]}
        }
      },
      Result: {
        $cond: {
          if: {$in: ["PASSED","$Result"]},
          then: "PASSED",
          else: "FAILED"
        }
      }
  }},
  {
    $group: {
      _id: "$_id.resultKey",
      No: {$addToSet: "$No"},
      Time: {$min: "$Time"},
      Counters: {$first: "$Counters"},
      TCR: {
        $push: {
          $arrayToObject: [
            [
              {"k": "name","v": "$_id.TCRName"},
              {"k": "Result",v: "$Result"}
            ]
          ]
        },
        
      }
  }},
  {$set: {
      No: {
        $reduce: {
          input: "$No",
          initialValue: [],
          in: {$setUnion: ["$$value","$$this"]}
        }
      }
  }},
  {$group: {
      _id: null,
      No: {$push: "$No"},
      Time: {$min: "$Time"},
      Results: {
        $push: {"k": "$_id",
                "v": {
                      Counters: "$Counters",
                      TCR: "$TCR"
                     }
               }
      }
  }},
  {$project: {
      Name: {
        No: {
          $reduce: {
            input: "$No",
            initialValue: [],
            in: {$setUnion: ["$$value","$$this"]}
          }
        },
        Time: {$min: "$Time"}
      },
      Results: {$arrayToObject: "$Results"}
  }}
])

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM