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

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

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

references(^._id)

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

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

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

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

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

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

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


person cabc    schedule 04.07.2019    source источник
comment
Есть ли в вашей схеме отношения между Sport и Page?   -  person thomax    schedule 29.07.2019


Ответы (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 правильно вложены в каждый вид спорта.

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

person thomax    schedule 29.07.2019
comment
Большое спасибо, Томакс, это определенно вдохновило меня на то, чтобы все заработало! - person cabc; 29.05.2021