2017-02-21 3 views
0

У меня есть своя совокупность, которую я тестирую, чтобы группировать документы по категориям и ограничивать результаты для каждой группы до N, которая в примере равна 20, так как мне нужно всего 100 результатов, и у меня есть 5 категорий.mongo query и slice Значение N

Значение 100 останется постоянным, но в случае, если число категорий может измениться, вместо жесткого кодирования целого числа я задавался вопросом, можно ли его вычислить? slicedocumentation говорит N can be any expression as long as it resolves to an integer, но не уверен, как заменить 20 чем-то более похожим на 100/category_count?

{ 
    $sort: { 
     created_at: 1 
    } 
}, { 
    $group: { 
     _id: { 
      category: "$category", 
      created_at: "$created_at", 
      video_id: "$video_id" 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.category", 
     items: { 
      $push: { 
       created_at: "$_id.created_at", 
       video_id: "$_id.video_id" 
      } 
     } 
    } 
}, { 
    $project: { 
     items: { 
      $slice: ["$items", 0, 20] 
     } 
    } 
} 

Благодаря Flo

+1

Что такое "category_count"? это имя вычисленного поля? – styvane

ответ

0

Вы можете обновить агрегацию трубопровода ниже. Используйте первый group, чтобы получить отдельный массив категорий, и используйте счет в project до slice каждой категории на основе этого.

{ 
    $group: { 
     _id: { 
      category: "$category", 
      created_at: "$created_at", 
      video_id: "$video_id" 
     }, 
     categories: { 
      $addToSet: "$category" 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.category", 
     items: { 
      $push: { 
       created_at: "$_id.created_at", 
       video_id: "$_id.video_id" 
      } 
     }, 
     categories: { 
      $first: "$categories" 
     } 
    } 
}, { 
    $project: { 
     items: { 
      $slice: ["$items", 0, { 
       $size: "$categories" 
      }] 
     } 
    } 
} 
+0

спасибо, но это не получает кол-во категорий, вместо этого возвращает счетчик массива «items». Нужно идти в первую «группу», но не уверен, как перенести вперед на проекцию? –

+0

Не уверен, правильно ли я понимаю ваше требование. Обновлен, чтобы включить «category_count» на первом групповом этапе. – Veeram

+0

Ваш 1-й ответ имеет смысл, но он возвращает количество записей в массиве 'items'. Не учитывается количество отдельных категорий, необходимых для расчета фрагмента проекта. Поэтому, когда я тестирую, category_count равен 168 или 211 и т.д .. не ожидаемый 5. –