Как использовать арифметический оператор для вычисления суммы

У меня есть тип review с полем rating, содержащим number от 1 до 5. Теперь я хотел бы вычислить средний рейтинг. Соответствующая схема:

    {
      name: 'rating',
      title: 'Rating',
      validation: Rule => Rule.required(),
      type: 'number'
    },

Sanity недавно добавил в GROQ арифметические операции, но я не знаю, как их использовать, и документации очень мало.

  1. Можно ли вычислить сумму всех оценок с помощью арифметической операции? Если да, то как?
  2. Можете ли вы также разделить сумму на количество всех отзывов в одном запросе?

person jgillich    schedule 11.01.2019    source источник


Ответы (1)


Я нашел решение, на самом деле довольно простое. Вы считаете каждую звезду индивидуально, затем суммируете их и делите на общее количество.

"rating":
  (
    (count(*[_type=='review' && references(^._id) && rating == 1]) * 1) +
    (count(*[_type=='review' && references(^._id) && rating == 2]) * 2) +
    (count(*[_type=='review' && references(^._id) && rating == 3]) * 3) +
    (count(*[_type=='review' && references(^._id) && rating == 4]) * 4) +
    (count(*[_type=='review' && references(^._id) && rating == 5]) * 5)
  ) / count(*[_type=='review' && references(^._id)])

Я полагаю, что это довольно дорого для Sanity для расчета, и это немного многословно, поэтому меня все еще интересуют другие решения.

person jgillich    schedule 12.01.2019
comment
Рад, что ты это понял! Ваше решение выглядит хорошо, не знаю, как его улучшить. Как вы подозреваете, при большом количестве проверочных документов это действительно может стать дорогостоящим запросом. - person thomax; 24.04.2019
comment
Также, пожалуйста, отметьте это как ответ? Помогает другим найти решение. - person thomax; 24.04.2019