2016-10-24 3 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" 
    }] 
} 

그래서, 내가 가지고 싶은 데이터는 I 집계하지만 여전히 내가 가지고 싶은 가까이에 아무것도를 해봤이

{ 
    _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

당신은 정말 괴짜 있습니다! –