Могу ли я связаться с бабушкой и дедушкой по запросу 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
правильно вложено под каждый вид спорта.
Отказ от ответственности: я не пробовал это на реальных данных, но я надеюсь, что вышеупомянутые запросы могут быть источником вдохновения, которое вам нужно, чтобы это заработало?