From b998391a6ccc325dea47b803d9bf74a9ef8dec80 Mon Sep 17 00:00:00 2001 From: Igor Antonov Date: Mon, 13 May 2024 21:54:35 +0300 Subject: [PATCH] =?UTF-8?q?5.16.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=20`offerCount`=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=B0=D0=B6?= =?UTF-8?q?=D0=B4=D0=BE=D0=B9=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit У нас есть список объявлений, которые относятся к определённой категории. В принципе, на этом можно и закончить. Необходимую информацию (количество) можно получить обратившись к свойству `length` массива `offers`. Но давайте пойдём дальше и попробуем решить эту задачу на этапе выборке. Для этого добавим новое поле с помощью оператора `$addFields`. Поле назовём `offerCount`. Его значением будет результат выполнения оператора `$size` для поля `$offers`. Оператор `$size` позволяет получить количество элементов в массиве. Обратите внимание, что мы дополнительно определяем поле `id`. В него мы сохраняем значение `_id`, предварительно сконвертировав его в строку. Это необходимо сделать, так как результат агрегации не будет соответствовать `CategoryEntity`. По структуре этот то же объект, но в нём не будет псевдонима `id`, который нам предоставляет `Typegoose`. Добавим его самостоятельно. В принципе, задача решена. Если посмотреть вывод списка категорий (сделать запрос), то видно, что поле `offerCount` появилось и заполняется. Но можно немного улучшить результат. --- src/shared/modules/category/category.service.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shared/modules/category/category.service.ts b/src/shared/modules/category/category.service.ts index 7fe8a83..67a45a1 100644 --- a/src/shared/modules/category/category.service.ts +++ b/src/shared/modules/category/category.service.ts @@ -52,6 +52,9 @@ export class DefaultCategoryService implements CategoryService { as: 'offers' }, }, + { $addFields: + { id: { $toString: '$_id'}, offerCount: { $size: '$offers'} } + }, ]).exec(); } }