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

Posted

技术标签:

【中文标题】我可以在不知道其 ID 的情况下更新 FaunaDB 文档吗?【英文标题】:Can I update a FaunaDB document without knowing its ID? 【发布时间】:2020-06-20 23:55:22 【问题描述】:

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" 
    )
  )

【问题讨论】:

【参考方案1】:

虽然 Bens cmets 是正确的,(这就是你这样做的方式),但我想指出你收到的错误是因为你在这里缺少一个括号:“users_by_email”,“我@example.com”

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

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

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

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

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

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

分页:

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

【讨论】:

【参考方案2】:

你很亲密!更新是否需要一个参考。不过,您可以通过索引获得一个。假设您的索引具有默认值设置(即分页匹配返回一页参考)并且您确信只有一个匹配或第一个匹配是您想要的,那么您可以执行Select(["ref"], Get(Match(Index("users_by_email"), "me@example.com"))) 来转换您的集合参考文档参考。然后可以将其传递给 update(或任何其他需要文档引用的函数,例如 Delete)。

【讨论】:

非常感谢你们!我接受这个作为答案,因为它解决了我的问题,尽管其他访问这个问题的人也应该阅读布莱希特的更多上下文。

以上是关于我可以在不知道其 ID 的情况下更新 FaunaDB 文档吗?的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 3.3.0 在不知道 ID 的情况下禁用按钮

如何在不取消选择注释的情况下更新标注视图?

如何在不重新打印的情况下更新终端中的打印消息

如何在不更新表单中所有字段的情况下进行更新

我可以在不执行合并的情况下从主干更新分支吗?

在不更改 IOS 7 的情况下更新现有应用程序