是否可以在不知道其ID的情况下更新FaunaDB文档?

时间:2020-03-09 04:20:52

标签: faunadb

FaunaDB的documentation介绍了如何更新文档,但是他们的示例假定我将把id传递给Ref

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

但是,我想知道是否有可能在不知道文档id的情况下更新文档 的情况。例如,如果我有一个users的集合,我可以通过他们的电子邮件找到一个用户,然后更新他们的记录吗?我已经尝试过了,但是Fauna返回了400(需要数据库引用,提供了字符串):

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

2 个答案:

答案 0 :(得分:8)

尽管Bens的评论是正确的(这就是您这样做的方式),但我想指出的是,您收到的错误是因为您在此处缺少括号:“ users_by_email” ,“ me@example.com”

如果您知道Index将可选的数据库引用作为第二个参数,则该错误是合乎逻辑的。

为澄清Ben所说的话: 如果执行此操作,则会收到另一个错误:

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

由于Match可能返回不止一个元素。它返回一个称为SetRef的引用的集合。将setrefs视为尚未实现的列表。如果确定该电子邮件只有一个匹配项(例如,如果您设置了唯一性约束),则可以使用分页或获取来实现它: 获取:

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

Get返回完整文档,我们需要使用Select(['ref'] ..

分页:

Update(
  Select(['data', 0], 
    Paginate(Match(
      Index("accounts_by_email"), "test@test.com"
    ))
  ),
  { data: { email: "testchanged@test.com"} }
)

答案 1 :(得分:7)

您非常亲密!更新确实需要引用。您可以通过索引获得一个。假设您的索引具有默认值设置(即,对匹配进行分页将返回引用的页面),并且您确信存在单个匹配项,或者第一个匹配项是您想要的匹配项,则可以执行Select(["ref"], Get(Match(Index("users_by_email"), "me@example.com")))进行转换您将参考设置为文档参考。然后可以将其传递给更新(或传递给需要文档引用的任何其他函数,例如Delete)。