0

Я хочу, чтобы агрегировать по 2 полям и хотите, чтобы gouping выполнялся вложенным образом. Как мне это достичь? В настоящее время я делаю группировку следующим образомКак агрегировать по нескольким полям в mongodb

var query = [ 
    { '$group': { 
    '_id': { 
     'employee': '$employee', 
     'sector': '$sector' 
    }, 
    'bookCount': { '$sum': 1 } 
    }}, 
    { '$sort': { 'count': -1 } } 
]; 

Order.aggregate(query, function(err, results){ 
    res.json(results) 
}); 

Я хочу, чтобы результаты, чтобы быть в форме

{abc:{sector1:4, sector3:5}, xyz: {sector1:10, sector2:23}} 

где азбука, хуг являются работниками и сектор1, сектора2 сектора.

Как мне заполнить, чтобы получить вложенные результаты?

Мой первоначальный документ

[ 
    { 
    "sector": "sector1", 
    "employee": "xyz" 
    }, 
    { 
    "sector": "sector1", 
    "employee": "abc" 
    }, 
    { 
    "sector": "sector1", 
    "employee": "abc" 
    }, 
    { 
    "sector": "sector2", 
    "employee": "abc" 
    } 
] 

Я хочу результат, чтобы быть в форме

{abc:{sector1:2,sector2:2}, xyz: {sector1:1}} 
+0

Показать исходный документ. –

ответ

2

Вы не можете использовать «данные» в качестве «ключевых имен» в рамках агрегации, а также нельзя создавать вложенные объекты с вложенными свойствами. Вы тоже не должны этого хотеть, так как это «анти-шаблон». Данные - это данные и должны оставаться такими. Кроме того, есть лучшие способы сделать это:

Order.aggregate([ 
    { "$group": { 
     "_id": { 
      "employee": "$employee", 
      "sector": "$sector" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id.employee", 
     "sectors": { 
      "$push": { 
       "sector": "$_id.sector", 
       "count": "$count" 
      } 
     } 
    }} 
],function(err,docs) { 

}); 

Который возвращает структуру, как это:

[ 
    { 
      "_id" : "xyz", 
      "sectors" : [ 
        { 
          "sector" : "sector1", 
          "count" : 1 
        } 
      ] 
    }, 
    { 
      "_id" : "abc", 
      "sectors" : [ 
        { 
          "sector" : "sector2", 
          "count" : 1 
        }, 
        { 
          "sector" : "sector1", 
          "count" : 2 
        } 
      ] 
    } 
] 

Так у вас есть первичный ключ группирования для значений «сотрудников» и других результатов «толкнул "к массиву.

Это гораздо лучшая структура с постоянными результатами в обозначении ключей.

+0

Почему вы назвали вложенный шаблон «анти-шаблон»? Я попытался добраться до этой формы, потому что с точки зрения использования это кажется более удобным. Является ли использование значений данных в качестве имен клавиш неправильным? После того, как я опубликовал этот вопрос, я написал код для манипулирования данными, возвращаемыми агрегированием, и вернулся в вложенном формате к клиенту. – raju

+1

@raju Перемещение вещей в «ключи», которые, очевидно, являются плохими. Хорошие объекты имеют согласованный интерфейс для свойств, а не тот, который всегда изменяется. Списки принадлежат массивам. Список много свойств в одном объекте с требуемыми «уникальными» именами, чтобы быть в состоянии сделать это плохо. –

Смежные вопросы