2016-08-01 76 views
3

結果我有下面的示例數據:分組一組查詢的MongoDB中

{ 
    "name": "Bob", 
    "mi": "K", 
    "martialStatus": "M", 
    "age": 30, 
    "city": "Paris", 
    "job": "Engineer" 
} 
{ 
    "name": "Chad", 
    "mi": "M", 
    "martialStatus": "W", 
    "age": 31, 
    "city": "Paris", 
    "job": "Doctor" 
} 
{ 
    "name": "Mel", 
    "mi": "A", 
    "martialStatus": "D", 
    "age": 31, 
    "city": "London", 
    "job": "Doctor" 
} 
{ 
    "name": "Frank", 
    "mi": "F", 
    "martialStatus": "S", 
    "age": 30, 
    "city": "London", 
    "job": "Engineer" 
} 

我想寫一個蒙戈查詢將在下面的格式返回結果: 「peopleCount」:4, 「jobsList」:{ 「工作」: 「醫生」, 「ageList」: { 「時代」:31, 「cityList」: { 「城市」: 「倫敦」, 「的人「:[ { 「名」: 「梅爾」, 「martialStatus」: 「d」 } ] }, { 「城市」: 「巴黎」, 「人」: { 「名」:「乍得」 「martialStatus」: 「W」 } ] },{ 「城市」: 「柏林」, ... ... ] } ] }

試穿前兩個級別(jobsList和ageList),我想下面的

db.colName.aggregate([ 
    { 
     $group: { 
      _id: { job: "$job" }, 
      jobsList: { 
       $push: { 
        age: "$age", 
        city: "$city", 
        name: "$name", 
        martialStatus: "$martialStatus" 
       } 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: { age: "$age" }, 
      ageList: { 
       $push: { 
        city: "$city", 
        name: "$name", 
        martialStatus: "$martialStatus" 
       } 
      } 
     } 
    } 
]); 

以上但不工作,雖然第一組/推部分作品...如何任何提示獲得輸出格式/分組?

回答

1
db.colName.aggregate([ 
{ 
    $group: { 
     _id: { job: "$job", age: "$age", city: "$city" }, 
     people: { $push: { name: "$name", martialStatus: "$martialStatus" } } 
    } 
}, 
{ 
    $group: { 
     _id: { job: "$_id.job", age: "$_id.age" }, 
     peopleCount: { $sum: { $size: "$people" } }, 
     cityList: { $push: { city: "$_id.city", people: "$people" } }, 
    } 
}, 
{ 
    $group: { 
     _id: { job: "$_id.job" }, 
     peopleCount: { $sum: "$peopleCount" }, 
     agesList: { $push: { age: "$_id.age", cityList: "$cityList" } } 
    } 
}, 
{ 
    $group: { 
     _id: null, 
     peopleCount: { $sum: "$peopleCount" }, 
     jobsList: { $push: { job: "$_id.job", agesList: "$agesList" } } 
    } 
}, 
{ 
    $project: { _id: 0, peopleCount: 1, jobsList: 1 } 
} 
]); 

在你所收集提供給我的結果

{ 
    "peopleCount" : 4, 
    "jobsList" : 
    [ 
    { 
     "job" : "Engineer", 
     "agesList" : 
     [ 
      { 
      "age" : 30, 
      "cityList" : 
       [ 
       { 
        "city" : "London", 
        "people" : 
        [ 
         { "name" : "Frank", "martialStatus" : "S" } 
        ] 
       }, 
       { 
        "city" : "Paris", 
        "people" : 
        [ 
         { "name" : "Bob", "martialStatus" : "M" } 
        ] 
       } 
       ] 
      } 
     ] 
    }, 
    { 
     "job" : "Doctor", 
     "agesList" : 
     [ 
      { 
      "age" : 31, 
      "cityList" : 
       [ 
       { 
        "city" : "London", 
        "people" : 
        [ 
         { "name" : "Mel", "martialStatus" : "D" } 
        ] 
       }, 
       { 
        "city" : "Paris", 
        "people" : 
        [ 
         { "name" : "Chad", "martialStatus" : "W" } 
        ] 
       } 
       ] 
      } 
     ] 
    } 
    ] 
} 

,這似乎是正確的。想到,我不確定這是最好的解決方案。我是聚合框架的新手。

+0

這按預期工作。謝謝你和開始聚合框架的好方法:)。 – rkh

+0

是否可以在joblist之前顯示如何在頂部添加另一個參數:「peopleCount」:4 – rkh

+0

您的情況可能是一個人住在多個城市或有多個工作,因此在您的收藏中會有幾個文件對應一個人? – tarashypka