как присоединиться к коллекциям в faunadb?

Я хочу получить вложенное значение ref в выполняемом мной запросе, но по умолчанию ответ возвращает ref из другой коллекции. рассмотрим этот минимальный пример; вот модели user и coin в коллекциях "users" и "coins"

user {     // ref: 123456
  name: foo
  location: bar
}
coin {     // ref: 124457
  amount: 5457
  awardedTo: Ref(Collection("users"), "123456")
}

когда я запускаю этот запрос

q.Get(q.Ref(q.Collection("coins"), "124457"))

ответ будет примерно таким:

{
  data: {
    amount: 5457,
    awardedTo: @ref: {id: "123456", collection: {…}}
  },
  ref: @ref: {id: "124457", collection: {…}},
  ts: 1622547855525255
}

Но как можно получить вложенное значение user в том же запросе, чтобы получить такой ответ:

{
  data: {
    amount: 5457,
    awardedTo: {
      name: foo,
      location: bar
    }
  },
  ref: @ref: {id: "124457", collection: {…}},
  ts: 1622547855525255
}

Я прочитал документацию Join, но в данном случае это не помогло, и тоже пробовали, но тоже не сработало:

q.Let({
  coin: q.Get(q.Ref(q.Collection("coins"), '124457'))
},
  q.Union(
    q.Get(q.Select(["data","awaredTo"], q.Var("coin"))),
    q.Var("coins")
  )
)

person Mhmdrz_A    schedule 25.11.2020    source источник


Ответы (1)


вы можете использовать этот FQL:

Let(
  {
    coin: Select(['data'],Get(Ref(Collection("coin"), "1"))),
    user: Select(['data'],Get(Select(['awardedTo'],Var('coin'))))
  },
  Merge(Var('coin'),{awardedTo:Var('user')})
)

Он извлекает данные из монеты, извлекает ссылку пользователя и объединяет все вместе.

Луиджи

person Luigi Servini    schedule 25.11.2020
comment
Я ожидал более причудливого решения, использующего Join или что-то в этом роде, но это поможет. - person Mhmdrz_A; 25.11.2020
comment
кстати, как вы думаете, весь этот запрос будет стоить 2 операции чтения? поскольку 2 Select для двух коллекций или 1 операция чтения для всего запроса - person Mhmdrz_A; 25.11.2020
comment
Привет, Леонардо, на самом деле документы читает не Select (), а Get (). В этом случае да, вам нужно получить 2 разных документа, поэтому будет прочитано 2. - person Luigi Servini; 26.11.2020