Могу ли я обновить документ FaunaDB, не зная его идентификатора? - PullRequest
4 голосов
/ 09 марта 2020

Документация FaunaDB описывает, как обновить документ, но в их примере предполагается, что у меня будет id для перехода в Ref:

Ref(schema_ref, id)
client.query(
  q.Update(
    q.Ref(q.Collection('posts'), '192903209792046592'),
    { data: { text: "Example" },
  )
)

Однако мне интересно, возможно ли обновить документ без , зная его id. Например, если у меня есть коллекция users, могу ли я найти пользователя по его электронной почте, а затем обновить его запись? Я пробовал это, но Фауна возвращает 400 (Ожидается ссылка на базу данных, предоставляется строка):

client
  .query(
    q.Update(
      q.Match(
        q.Index("users_by_email", "me@example.com")
      ),
      { name: "Em" }
    )
  )

Ответы [ 2 ]

4 голосов
/ 09 марта 2020

Хотя комментарии Бенса верны, (это то, как вы это делаете), я хотел заметить, что ошибка, которую вы получаете, заключается в том, что здесь отсутствует скобка: "users_by_email" ) , "me@example.com "

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

Чтобы уточнить, что сказал Бен: если вы сделаете это, вы получите еще одну ошибку:

Update(
  Match(
    Index("accounts_by_email"), "test@test.com"
  ),
  { data: { email: "test2@test.com"} }
)

Поскольку Match потенциально может вернуть более одного элемента. Он возвращает набор ссылок, называемых SetRef. Думайте о setrefs как о списках, которые еще не материализованы. Если вы уверены, что есть только одно совпадение для этого электронного письма (например, если вы установили ограничение уникальности), вы можете материализовать его, используя Paginate или Get: Get:

Update(
  Select(['ref'], Get(Match(
      Index("accounts_by_email"), "test@test.com"
  ))),
  { data: { email: 'test2@test.com'} }
)

Get возвращает полный документ, нам нужно указать, что нам требуется ссылка с помощью Select (['ref'] ..

Paginate:

Update(
  Select(['data', 0], 
    Paginate(Match(
      Index("accounts_by_email"), "test@test.com"
    ))
  ),
  { data: { email: "testchanged@test.com"} }
)
4 голосов
/ 09 марта 2020

Ты очень близко! Обновление требует Требуется ссылка. Вы можете получить один через ваш индекс, хотя. Предполагая, что ваш индекс имеет настройку значений по умолчанию (т. Е. Постраничное сопоставление возвращает страницу ссылок), и вы уверены, что есть одно совпадение или первое совпадение - то, которое вы хотите, тогда вы можете сделать Select(["ref"], Get(Match(Index("users_by_email"), "me@example.com"))), чтобы преобразовать ваш набор ссылка на документ ссылка Затем его можно передать в обновление (или в любую другую функцию, для которой требуется ссылка на документ, например Delete).

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