2016-10-24 4 views
2

私はこのようなデータを持っています。私がしようとしていることは、従業員を性別でグループ化することです。Mongo Group条件と数:

{ 
    _id: ObjectId("57fd6b064a8d7733079d1bb9"), 
    name: "Alex", 
    age: 23, 
    position: "Manager", 
    employees: [{ 
     _id: ObjectId("58056e62281b7a73dfdb6887"), 
     employee_id: ObjectId("57df832364efef57c3540610"), 
     name: "Bob", 
     age: 20, 
     gender: "Male", 
     position: "Distributor" 
    }, { 
     _id: ObjectId("58049fe7bc82e44583c52a64"), 
     employee_id: ObjectId("57df830264efef57c354060d"), 
     name: "Cindy", 
     age: 19, 
     gender: "Female", 
     position: "Administrator" 
    }, { 
     _id: ObjectId("58049fe7bc82e44583c52a64"), 
     employee_id: ObjectId("57df830264efef57c354060d"), 
     name: "Dylan", 
     age: 21, 
     gender: "Male", 
     position: "Engineer" 
    }] 
} 

だから、私が持っているしたいデータは、私は、集約が、それでも私が持ちたいものに近い何をしようとしました。この

{ 
    _id: ObjectId("57fd6b064a8d7733079d1bb9"), 
    name: "Alex", 
    age: 23, 
    position: "Manager", 
    male_employees: 2, 
    female_employees: 1, 
} 

のようなものです。 私は彼らとあなたのアグリゲーションパイプラインで同時に

答えて

3

での使用サイズは、あなたがグループに文書を必要とするが、ちょうどあなたが単一$projectパイプラインとを使用するフィールドを突出しないかのグループに見当がつかないあなたは$unwindを使用せずに、性別に基づいて従業員の数を取得するために$size$filterコンボを使用する必要があるだろうということ。

$filter等式の一部は、与えられた条件に基づいて配列要素を除外します(この場合、バイナリのジェンダー値になります)。 $sizeオペレータは、フィルタリングされた配列の長さを返します。したがって、従業員の数がカウントされます。

はのは一例でこれを見てみましょう:

var count = function(gender){ 
    return { 
     "$size": { 
      "$filter": { 
       "input": "$employees", 
       "as": "emp", 
       "cond": { "$eq": [ "$$emp.gender", gender ] } 
      } 
     } 
    } 
}; 
db.collection.aggregate([ 
    { 
     "$project": { 
      "name": 1, 
      "age": 1, 
      "position": 1, 
      "male_employees": count("Male"), 
      "female_employees": count("Female") 
     } 
    } 
]); 

サンプル出力

{ 
    "_id" : ObjectId("57fd6b064a8d7733079d1bb9"), 
    "name" : "Alex", 
    "age" : 23, 
    "position" : "Manager", 
    "male_employees" : 2, 
    "female_employees" : 1 
} 
+2

あなたは本当にオタクです! –