Mongo $ sum $ cond с двумя условиями - PullRequest
2 голосов
/ 07 июля 2019

У меня есть запрос на агрегацию, который возвращает сумму / общее количество отзывов, отправленных для данного местоположения (не средний звездный рейтинг).Отзывы набраны 1 - 5 звезд.Этот конкретный запрос группирует эти обзоры по двум категориям: «внутренняя» и «google».

У меня есть запрос, который возвращает результаты, которые почти соответствуют тому, что я ищу.Однако мне нужно добавить дополнительное условие для внутренних проверок.Я хочу убедиться, что значение "звездочки" для внутренних проверок существует / не равно нулю и содержит значение как минимум 1. Итак, я подумал, что добавление чего-то похожего на это будет работать:

{ "stars": {$gte: 1} }

Этотекущий запрос агрегации:

[
      {
        $match: { createdAt: { $gte: fromDate, $lte: toDate } }
      },
      {
        $lookup: {
          from: 'branches',
          localField: 'branch',
          foreignField: '_id',
          as: 'branch'
        }
      },
      { $unwind: '$branch' },
      {
        $match: { 'branch.org_id': branchId }
      },
      {
        $group: {
          _id: '$branch.name',
          google: {
            $sum: {
              $cond: [{ $eq: ['$source', 'Google'] }, 1, 0]
            }
          },
          internal: {            
            $sum: {
              $cond: [  { $eq: ['$internal', true]}, 1, 0 ],
            },
          }
        }
      }
]

Усеченная схема:

  {
    branchId: { type: String, required: true },
    branch: { type: Schema.Types.ObjectId, ref: 'branches' },
    wouldRecommend: { type: String, default: '' }, // RECOMMENDATION ONLY
    stars: { type: Number, default: 0 }, // IF 1 - 5 DOCUMENT IS A REVIEW
    comment: { type: String, default: '' },
    internal: { type: Boolean, default: true },
    source: { type: String, required: true },
  },
  { timestamps: true }

Мне нужно убедиться, что я не учитываю рекомендации "хотел бы рекомендовать" в сумме внутренних обзоров.Определите, является ли что-то рецензией, оно будет иметь рейтинг в 1 или более звездочек.В рекомендациях звездочка будет иметь значение 0.

Как добавить условие, обеспечивающее, чтобы внутреннее значение "$ stars" было> = 1 (больше или равно 1)?

ИспользованиеОтвет Аша Мне удалось сформировать этот запрос:

[
  {
    $lookup: {
      from: 'branches',
      localField: 'branch',
      foreignField: '_id',
      as: 'branch'
    }
  },
  { $unwind: '$branch' },
  {
    $match: {
      'branch.org_id': branchId
    }
  },
  {
    $group: {
      _id: '$branch.name',
      google: {
        $sum: {
          $cond: [{ $eq: ['$source', 'Google'] }, 1, 0]
        }
      },
      internal: {
        $sum: {
          $cond: [
            {
              $and: [{ $gte: ['$stars', 1] }, { $eq: ['$internal', true] }]
            },
            1,
            0
          ]
        }
      }
    }
  }
];

1 Ответ

2 голосов
/ 07 июля 2019

Вы можете использовать $and с оператором $cond

{ "$group": {
  "_id": "$branch.name",
  "google": { "$sum": { "$cond": [{ "$eq": ["$source", "Google"] }, 1, 0] }},
  "internal": { "$sum": { "$cond": [{ "$eq": ["$internal", true] }, 1, 0 ] }},
  "rating": {            
    "$sum": {
      "$cond": [
        {
          "$and": [
            { "$gte": ["$stars", 1] },
            { "$eq": ["$internal", true] }
          ]
        },
        1,
        0
      ],
    }
  }
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...