2016-12-01 9 views
0

У меня есть следующие документы:MongoDB сортировка по детям

{'_id':'id1','parentId':"",'count':1} 
    {'_id':'id2','parentId':"",'count':12} 
    {'_id':'id3','parentId':"",'count':16} 
    {'_id':'id4','parentId':"id2",'count':3} 
    {'_id':'id5','parentId':"id2",'count':3} 
    {'_id':'id6','parentId':"id1",'count':0 
{'_id':'id7','parentId':"id1",'count':122} 

ParentID с «» поле представляет собой родительский узел. Если присутствует parentId, это означает дочерний узел родительского идентификатора. Мне нужен запрос, который будет сортировать по «count» (убыв), но я хочу, чтобы он возвращал курсор parentId. Однако, если подсчет количества детей является самым высоким, это означает, что наибольшее значение в целом и родительский элемент этого ребенка должны быть возвращены.

Результат выполнения запроса на приведенных выше данных следует предоставить мне документы в следующем порядке: ID1, id3, id2

Я думал о запуске в трубопровод агрегации. На первом этапе я могу сделать сортировку по счету. Однако я не знаю, как я могу получить запрос, возвращающий ParentID для ребенка ...

+0

вы можете показать свой выходной документ? –

+0

Привет Shaishab, я хочу, чтобы результат был таким же, как и вышеприведенные документы. Это все проецируется. То есть Id1, содержащий все свои поля, не имеет ничего общего с дочерними элементами, хотя дети затронули запрос –

+0

, так что же такое позиция * id7 *? –

ответ

1

Вы можете сделать это с помощью следующей агрегации:

db.collection.aggregate(
    [ 
    { 
     $project: { 
     group_id : { $cond : { if: { $ne: [ "$parentId", "" ] }, then: "$parentId", else: "$_id" }}, 
     count :1 
     } 
    }, 
    { 
     $group: { 
     _id : "$group_id", 
     total_count : { $sum: "$count" } 
     } 
    }, 
    { 
     $sort: { 
     total_count : -1 
     } 
    } 
    ] 
); 

Сначала я проецировать дополнительное поле «group_id ", который заполняется _id или parentId в зависимости от значения parentId. Поле group_id используется для группировки и подсчета общего количества. Последний шаг - сгруппировать по total_count.

При использовании MongoDB 3.4 вы можете проверить $graphLookup но сейчас я оставляю вас с предварительной 3.4 агрегации ;-)

+0

Hi HoefMeistert, Спасибо за ответ, я просто прохожу через него. Разве это не суммирует счет всех детей и родителей? Я хочу просто наивысший счет для группы, не обязательно сумму. Будет ли изменение $ sum до $ max исправлять это? Я просто думаю об этом через –

+0

Также я думал, что 3.2 была самой высокой версией mongo –

+0

@xenophon MongoDB 3.4 был выпущен на этой неделе: [Объявление общей доступности MongoDB 3.4] (https://www.mongodb.com/blog/post/объявляя-генерал-усвояемость-оф-MongoDB-3-4-и-ошибок охота-победителей). Конвейер сценария ['$ graphLookup'] (https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/) выполняет рекурсивный поиск (с фильтрами запросов и настройками глубины), поэтому должен быть полезен для вашего использование случай. – Stennie

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