首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongo查询中的合并结果与条件

mongo查询中的合并结果与条件
EN

Stack Overflow用户
提问于 2021-03-25 07:31:17
回答 1查看 144关注 0票数 0

用例:

我有n个作业,我想要合并这些作业的数据,这样,如果在1种情况下传递相应子键的值,它应该将其标记为已传递。

例如Job1的详细目标:

代码语言:javascript
复制
{"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详细对象:

代码语言:javascript
复制
{"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"}]
                      
                    }
            
           ]
}

预期产出

代码语言:javascript
复制
{"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在两个块中都很常见,所以在k1中,我们有键k12和k13,它们在一个中传递,而在另一个块中失败。因此,在预期的输出中,我需要键k1,键k12和k13具有传递的值,因为它们在一种情况下被传递。与此同时,K2和K3也将如出一辙。

我已经到了将相同的关键数据聚集在一行,但是如何继续进行进一步比较的时候。

查询使用-

代码语言:javascript
复制
aggregate([{$match: {
  $or:[{"Name.No":"119"},{"Name.No":"120"}]
}}, {$project: {
  x:{$objectToArray:"$Results"}
}},{$unwind: "$x"},{$group: {_id: "$x.k", distinctVals: {$addToSet: "$x.v.TCR"}}}])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-26 18:30:17

名称/结果字段是:

在一个物体中

在数组中

嵌入在以下对象中

嵌入在另一个对象中

在数组中

嵌入在文档中。

这是很多层的剥皮。

因此,要获得名称/结果对:

  • 展开文档中的数组
  • 将嵌入的对象转换为数组
  • 展开转换后的数组
  • 进入最后一个文档并展开深数组。

然后把它们结合起来

  • 按名称部分分组,将所有传递/失败结果推入数组中。
  • 对构造的数组进行约简,以确定总的传递/失败值
  • 按键分组(K1、K2等)并将名称/结果推入数组
  • group by null (即没有组创建单个文档)将它们键推到结果数组中
  • 重构文档结构

通过所有这些步骤,维护全局字段,如名称和时间。

看起来可能是:

代码语言:javascript
复制
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"}
  }}
])

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66794953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档