使用MongoDB聚合将数据收集到分层结果中以节省带宽

时间:2018-03-15 00:05:06

标签: mongodb aggregation-framework query-optimization pymongo

我有一组具有长值的文档,我想将它们减少为分层结果以减少带宽。以下面的文档为例:

{
  "platform" : "osx",
  "buildmode" : "release",
  "testsuite" : "geometry sub system",
  "testcase" : "comparison of bounding box techniques",
},
{
  "platform" : "osx",
  "buildmode" : "release",
  "testsuite" : "geometry sub system",
  "testcase" : "comparison of bounding box techniques",
},
{
  "platform" : "win7",
  "buildmode" : "debug",
  "testsuite" : "payload storage",
  "testcase" : "fit-to-size",
}

每次更改版本中有1200个,并且发送回所有1200的带宽很重,特别是因为关键字" osx"," release"和"几何子系统"重复了这么多次。我想返回这些数据,以便顶级对象具有一个名为的对象数组:' platform'和buildmodes:[array]其中buildmode是一个具有' name&的对象数组#39; :buildmode和testsuite:[array],以及on和on。基本上这样,少数测试套件将包含其中的测试用例。

我做了一些分析,并确定这应该缩小我的输出,并使我的UI工具(四个组合框的集合)更容易编写。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。

db.collection.aggregate([
  {"$group":{
    "_id":{"platform":"$platform","buildmode":"$buildmode","testsuite":"$testsuite"},
    "testcase":{"$push":"$testcase"}
  }},
  {"$group":{
    "_id":{"platform":"$_id.platform","buildmode":"$_id.buildmode"},
    "testsuite":{"$push":{"testsuite":"$_id.testsuite","testcase":"$testcase"}}
  }},
  {"$group":{
    "_id":{"platform":"$_id.platform"},
    "buildmode":{"$push":{"buildmode":"$_id.buildmode","testsuite":"$testsuite"}}
  }}
])