2013-09-26 2 views
2

У меня есть коллекция Монго, наполненные документы, как следующее:Итоговые документов в древовидной структуре

{ 
    area: "Some area", 
    group: "group name", // area includes different groups 
    name: "name" // there are many names in each group 
} 

А для переднего конца, мне нужна древовидная структура:

{ _id: "area name", 
    name: "same as _id", 
    ap: { 
    children: [ 
     { name: "group name, children: [ { name: "name from the doc" } ] }, 
     ... 
    ] 
    } 
} 

Меня интересует, насколько сложно это сделать с помощью структуры агрегации или можно ли это сделать? Или лучше вычислить это на стороне клиента?

ответ

1

Хотя может быть возможно получить текущую структуру агрегации для выработки аналогичной структуры с большим трудом (и очень длинным конвейером), это будет не просто или хорошо подходит. Структура агрегации предназначена для агрегирования документов и составления сводок, групп и т. Д. Хотя он может делать прогнозы данных, вы обнаружите, что это громоздко, если вам нужно больше, чем несколько полей в результатах.

Также стоит взглянуть на ограничения рамочной системы в настоящее время here. Результат по 2.4 не может превышать 16 МБ.

Я бы рекомендовал вам построить структуру на клиенте. Это освобождает базу данных от занятой работы и распределяет усилия для клиентов. Если это большая структура, вы должны в любом случае учитывать кеширование результатов.

0

В дополнение к принятому ответу WiredPrairies, если вам нужны размеры/границы карты деревьев быстро, вы можете сделать это, как показано ниже.

db.appconsumers.aggregate(
    {$unwind: "$taxonomies"}, 
    {$project: 
     {"tier1" : "$taxonomies.tier1", 
     "tier2" : "$taxonomies.tier2", 
     "tier3" : "$taxonomies.tier3", 
     "tier4" : "$taxonomies.tier4", 
     "tier5" : "$taxonomies.tier5"}}, 
    {$group: 
     {_id: {"tier1":"$tier1", "tier2": "$tier2", "tier3":"$tier3", "tier4":"$tier4","tier5":"$tier5"}, count:{$sum: 1}}}) 

Выход

{ 
    "_id" : { 
     "tier1" : "Arts & Entertainment", 
     "tier2" : "Movies", 
     "tier3" : "Kill Bill" 
    }, 
    "count" : 15 
}, 
{ 
    "_id" : { 
     "tier1" : "Arts & Entertainment", 
     "tier2" : "Movies" 
    }, 
    "count" : 20 
}, 
{ 
    "_id" : { 
     "tier1" : "Arts & Entertainment", 
     "tier2" : "Movies", 
     "tier3" : "Kill Bill", 
     "tier4" : "Main characters", 
     "tier5" : "Bill" 
    }, 
    "count" : 5 
} 
Смежные вопросы