Могу ли я связаться с бабушкой и дедушкой по запросу GROQ?

Я пытаюсь выполнить запрос GROQ для моего проекта Sanity.io, который должен отфильтровывать дочерние документы, содержащие ссылки на основе идентификатора бабушки и дедушки. Возможно ли это сделать?

Я пришел к выводу, что для подобных сценариев я мог бы использовать родительский оператор следующим образом:

references(^._id)

Но в моем случае мне нужен идентификатор бабушки и дедушки, поэтому я не могу использовать родительский оператор так, как я написал запрос сейчас.

Я также могу четко прочитать в документации:

Известная проблема Оператор ^ в настоящее время работает только из подзапросов. Во всех других областях он возвращает корень текущей области, а не родительскую область. Также невозможно использовать ^ для обозначения областей видимости.

Но нет информации об обходном пути.

Запрос в настоящее время выглядит следующим образом. Мне нужны только страницы, которые относятся к идентификатору команды. Но сейчас, используя ссылки (^._id) в текущей позиции (страницы), я получаю ссылочный идентификатор только от родителя (спорт), а не от бабушки и дедушки (команды), которые мне нужны.

*[_type == 'client' && alias == 'ipsum']{
    _id, name, teams[]->{
        _id, name,
        sports[]->{
            name,
            "pages": *[_type=='page' && references(^.id)]
        }
    }
}

Заранее спасибо, любая помощь будет принята с благодарностью.

1 ответ

Очень краткий ответ: Вы правы в том, что в настоящее время нет возможности ссылаться на деда в GROQ.

Тем не менее, обычно есть способ обойти такие препятствия.

Если ваша схема не содержит прямой связи между Sport а также PageВозможно, вам лучше собирать страницы по командам:

*[_type == 'client' && alias == 'ipsum']{
  _id, name, teams[]->{
    _id, name,
    sports[]-> {_id, name},
    "pages": *[_type=='page' && references(^._id)]
  }
}

Это уменьшит объем данных, передаваемых для каждого запроса, потому что вы больше не поднимаете идентичный набор страниц для каждого вида спорта.

Если ваша схема имеет прямую связь между Sport а также Pageнапример someSport.page._refтогда следующий запрос будет включать только эти страницы:

*[_type == 'client' && alias == 'ipsum']{
  _id, name, teams[]->{
    _id, name,
    sports[]-> {
      _id,
      name,
      "pageId": page._ref
    },
    "sportPages": *[_type=='page' && references(^._id) && _id in ^.sports[].page._ref]
  }
}

В последнем случае вы могли бы предпочесть несколько обработок данных на стороне клиента, чтобы получить различные sportPages правильно вложено под каждый вид спорта.

Отказ от ответственности: я не пробовал это на реальных данных, но я надеюсь, что вышеупомянутые запросы могут быть источником вдохновения, которое вам нужно, чтобы это заработало?

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