Фильтрация массива дат (datetime) с помощью GROQ (здравомыслие) (React App)

У меня есть список фильмов, которые можно показывать более одного раза. Я решил предоставить пользователю возможность выбрать несколько дат для одного фильма (интерфейс студии Sanity).

Схема для фильмов выглядит следующим образом:

export default {
  name: 'movie',
  title: 'Movie',
  type: 'document',
  fields: [
    {
      name: 'title',
      title: 'Title',
      type: 'string'
    },
    {
      name: 'dates',
      title: 'Dates',
      type: 'array',
      of: [
        {
          type: 'datetime',
          options: {
            dateFormat: 'YYYY-MM-DD',
            timeFormat: 'HH:mm',
            timeStep: 15,
            calendarTodayLabel: 'Today'
          }
        }
      ]
    },
    {
      name: 'poster',
      title: 'Poster',
      type: 'image',
      options: {
        hotspot: true
      }
    },
    {
      name: 'body',
      title: 'Body',
      type: 'blockContent'
    }
  ],

  preview: {
    select: {
      title: 'title',
      date: 'date',
      media: 'poster'
    }
  }
}

Текущий запрос:

const query = groq`*[_type == "movie"]{
  title,
  dates,
  poster,
  body
}`

Мне нужно отфильтровать фильм, который имеет сегодняшнюю дату в массиве дат с помощью GROQ

Может быть, я слишком усложняю это, и кто-то придумает лучший способ.

Идея состоит в том, чтобы избежать дубликатов в базе данных (1 фильм может быть показан 3-6 раз). Это единственная причина, по которой я использовал массив

0 ответов

Решением для этого должно быть:

const query = '*[_type == "movie" && dates match $today]{title, dates, poster, body}'
const today = new Date().toISOString().split('T')[0]
client.fetch(query, {today}).then(result => {
  // movies which are showing today
})

Однако в настоящее время в токенизаторе строк есть ошибка, которая нарушает сопоставление строки даты. А пока, боюсь, единственный вариант - получить все фильмы и отфильтровать клиентскую часть. Мы надеемся исправить это как можно скорее.

Другие вопросы по тегам