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

Em.*_*Em. 11 faunadb

FaunaDB 的文档涵盖了如何更新文档,但他们的示例假设我将id要传入Ref

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

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

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

Bre*_*oms 12

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

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

澄清 Ben 所说的话:如果你这样做,你会得到另一个错误:

Update(
  Match(
    Index("accounts_by_email"), "test@test.com"
  ),
  { data: { email: "test2@test.com"} }
)
Run Code Online (Sandbox Code Playgroud)

由于 Match 可能会返回多个元素。它返回一称为 SetRef 的引用。将 setref 视为尚未具体化的列表。如果您确定该电子邮件只有一个匹配项(例如,如果您设置了唯一性约束),您可以使用 Paginate 或 Get: 获取:

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

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

分页:

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


ben*_*nji 10

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