universo-platform-3d

Форк
0
/
populate-user-entity-actions-in-spaces.pipeline.ts 
91 строка · 2.1 Кб
1
import { PipelineStage } from 'mongoose'
2
import { PopulateField } from '../../util/pagination/pagination.service'
3

4
export const getPopulateUserEntityActionsStatsAggregationPipeline = (
5
  matchCondtion?: PipelineStage.Match,
6
  populateFields?: PopulateField[]
7
) => {
8
  const pipeline: PipelineStage[] = [
9
    {
10
      $lookup: {
11
        from: 'userentityactions',
12
        localField: '_id',
13
        foreignField: 'forEntity',
14
        as: 'entityActions'
15
      }
16
    },
17
    {
18
      $unwind: {
19
        path: '$entityActions',
20
        preserveNullAndEmptyArrays: true
21
      }
22
    },
23
    {
24
      $group: {
25
        _id: '$_id',
26
        entityDetails: { $first: '$$ROOT' },
27
        AVG_RATING: { $avg: '$entityActions.rating' },
28
        COUNT_LIKE: {
29
          $sum: {
30
            $cond: [{ $eq: ['$entityActions.actionType', 'LIKE'] }, 1, 0]
31
          }
32
        },
33
        COUNT_FOLLOW: {
34
          $sum: {
35
            $cond: [{ $eq: ['$entityActions.actionType', 'FOLLOW'] }, 1, 0]
36
          }
37
        },
38
        COUNT_SAVES: {
39
          $sum: {
40
            $cond: [{ $eq: ['$entityActions.actionType', 'SAVE'] }, 1, 0]
41
          }
42
        },
43
        COUNT_RATING: {
44
          $sum: {
45
            $cond: [{ $eq: ['$entityActions.actionType', 'RATING'] }, 1, 0]
46
          }
47
        }
48
      }
49
    },
50
    {
51
      $project: {
52
        'entityDetails.entityActions': 0
53
      }
54
    },
55
    {
56
      $replaceRoot: {
57
        newRoot: {
58
          $mergeObjects: [
59
            '$entityDetails',
60
            {
61
              AVG_RATING: '$AVG_RATING',
62
              COUNT_LIKE: '$COUNT_LIKE',
63
              COUNT_FOLLOW: '$COUNT_FOLLOW',
64
              COUNT_SAVES: '$COUNT_SAVES',
65
              COUNT_RATING: '$COUNT_RATING'
66
            }
67
          ]
68
        }
69
      }
70
    }
71
  ]
72

73
  if (matchCondtion) {
74
    pipeline.unshift(matchCondtion)
75
  }
76

77
  if (populateFields && populateFields.length > 0) {
78
    populateFields.forEach((populate) => {
79
      pipeline.splice(1, 0, {
80
        $lookup: {
81
          from: populate.from,
82
          localField: populate.localField,
83
          foreignField: '_id',
84
          as: populate.localField
85
        }
86
      })
87
    })
88
  }
89

90
  return pipeline
91
}
92

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.