2016-04-01 2 views
1

У меня есть приложение для отчетности, и я генерирую команды mongodb, и он включает в себя запуск трех совокупных вызовов. Совокупные вызовы имеют [match, group, project] в своих трубах.

RESULT OF AGGREGATE 1-3 
{_id: <XXX>, ...} 

группировка «_id» для этих вызовов одинаковы, но, поскольку их $ матч разные, они не могут быть в одной и той же совокупности вызова. Мне нужно присоединиться ко всем этим результатам агрегирования. Я знаю, что одним из способов решения этого является использование условий на этапе $ group, но проблема в том, что условия действительно сложны для смешивания с уже сложным $ group pipe.

Чтобы дать некоторый контекст, почему это решение очень сложно, если не невозможно; данные довольно велики, каждый документ имеет 700 атрибутов, а документы идут со скоростью около 1k в день. Создание такого сложного состояния в поле EACH на этапе $ group вызовет беспорядок.

Я видел ответы, которые запускают map-reduce для объединения этих результатов агрегирования, но я ищу другие решения. Как я исследовал, агрегат имеет $ out pipe. Есть ли способ, которым я могу манипулировать этим $ out pipe, чтобы присоединиться к этим результатам агрегации? (Причина, по которой мы думаем о $ out, состоит в том, что мне все равно нужно сохранять ВСЕ результаты в качестве отчета)

+0

Хорошо, поэтому '$ out' всегда перезаписывает коллекцию, и вам в основном нужно будет перебирать курсоры и выводить на другую коллекцию на итерацию курсора или делать все, что вам нужно. И это детали, которые полностью отсутствуют в этом вопросе. Забудьте о больших страшных номерах, поскольку они не актуальны. Вместо этого описать фактическую проблему с основными примерами документов и желаемым результатом. –

ответ

0

Если вы действительно хотите продолжить объединение результатов агрегирования, вы можете создать выходную коллекцию, используя массовые upserts. Для производительности вы можете создать составной индекс в этой выходной коллекции, в которой есть ваши атрибуты группировки.

dataArray.map(function(data) { 
    data.forEach(function(err, row){ 
     var setOnInsert = {grouping_attrs: row.grouping_values, v1: row.v1} 
     var set = {v2: row.v2} 
     var query = {grouping_attrs: row.grouping_values} 
     bulk.find(query).upsert().update({$setOnInsert: setOnInsertStmt, $set: set}); 
    })  
}) 

Здесь ваш dataArray создается с помощью находку на $out коллекций.

+0

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

+0

Старался дать намек на то, как это сделать. Конечно, вы будете учитывать ваши отзывы при ответе. Спасибо за это. – hyades

+1

Я «согласен», что это, вероятно, правильный подход. Но вопрос ОФ является способом широкого для определенного утверждения. –

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