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 трубопровода и с что вам нужно использовать $size и $filter комбо, чтобы получить количество сотрудников в зависимости от пола без использования $unwind.

$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

Вы действительно выродок! –