我可以在不知道 ID 的情况下更新 FaunaDB 文档吗?
Can I update a FaunaDB document without knowing its ID?
FaunaDB 的 documentation covers how to update a document, but their example assumes that I'll have the id
to pass into Ref
:
Ref(schema_ref, id)
client.query(
q.Update(
q.Ref(q.Collection('posts'), '192903209792046592'),
{ data: { text: "Example" },
)
)
但是,我想知道是否可以在 不知道 id
的情况下更新文档 。例如,如果我有一个 users
的集合,我可以通过他们的电子邮件找到用户,然后更新他们的记录吗?我试过了,但是 Fauna returns 400(需要数据库引用,提供了字符串):
client
.query(
q.Update(
q.Match(
q.Index("users_by_email", "me@example.com")
),
{ name: "Em" }
)
)
你很亲近!更新 是否需要参考。你可以通过你的索引得到一个。假设你的索引有一个默认值设置(即分页匹配 returns 一页参考文献)并且你确信有一个匹配或第一个匹配是你想要的然后你可以做 Select(["ref"], Get(Match(Index("users_by_email"), "me@example.com")))
将您的集合引用转换为文档引用。然后可以将其传递给更新(或任何其他需要文档引用的函数,如 Delete
)。
虽然 Bens 的评论是正确的,(这就是你这样做的方式),但我想指出你收到的错误是因为你在这里缺少一个括号:"users_by_email") 、"me@example.com"
如果您知道 Index 将可选的数据库引用作为第二个参数,则该错误是合乎逻辑的。
为了澄清 Ben 所说的话:
如果你这样做,你会得到另一个错误:
Update(
Match(
Index("accounts_by_email"), "test@test.com"
),
{ data: { email: "test2@test.com"} }
)
因为 Match 可能 return 不止一个元素。它 return 是一个 集合 的引用,称为 SetRef。将 setrefs 视为尚未具体化的列表。如果您确定该电子邮件只有一个匹配项(例如,如果您设置了唯一性约束),您可以使用 Paginate 或 Get 实现它:
得到:
Update(
Select(['ref'], Get(Match(
Index("accounts_by_email"), "test@test.com"
))),
{ data: { email: 'test2@test.com'} }
)
获取 return 完整文档,我们需要指定我们需要 Select(['ref']..
分页:
Update(
Select(['data', 0],
Paginate(Match(
Index("accounts_by_email"), "test@test.com"
))
),
{ data: { email: "testchanged@test.com"} }
)
FaunaDB 的 documentation covers how to update a document, but their example assumes that I'll have the id
to pass into Ref
:
Ref(schema_ref, id)
client.query(
q.Update(
q.Ref(q.Collection('posts'), '192903209792046592'),
{ data: { text: "Example" },
)
)
但是,我想知道是否可以在 不知道 id
的情况下更新文档 。例如,如果我有一个 users
的集合,我可以通过他们的电子邮件找到用户,然后更新他们的记录吗?我试过了,但是 Fauna returns 400(需要数据库引用,提供了字符串):
client
.query(
q.Update(
q.Match(
q.Index("users_by_email", "me@example.com")
),
{ name: "Em" }
)
)
你很亲近!更新 是否需要参考。你可以通过你的索引得到一个。假设你的索引有一个默认值设置(即分页匹配 returns 一页参考文献)并且你确信有一个匹配或第一个匹配是你想要的然后你可以做 Select(["ref"], Get(Match(Index("users_by_email"), "me@example.com")))
将您的集合引用转换为文档引用。然后可以将其传递给更新(或任何其他需要文档引用的函数,如 Delete
)。
虽然 Bens 的评论是正确的,(这就是你这样做的方式),但我想指出你收到的错误是因为你在这里缺少一个括号:"users_by_email") 、"me@example.com"
如果您知道 Index 将可选的数据库引用作为第二个参数,则该错误是合乎逻辑的。
为了澄清 Ben 所说的话: 如果你这样做,你会得到另一个错误:
Update(
Match(
Index("accounts_by_email"), "test@test.com"
),
{ data: { email: "test2@test.com"} }
)
因为 Match 可能 return 不止一个元素。它 return 是一个 集合 的引用,称为 SetRef。将 setrefs 视为尚未具体化的列表。如果您确定该电子邮件只有一个匹配项(例如,如果您设置了唯一性约束),您可以使用 Paginate 或 Get 实现它: 得到:
Update(
Select(['ref'], Get(Match(
Index("accounts_by_email"), "test@test.com"
))),
{ data: { email: 'test2@test.com'} }
)
获取 return 完整文档,我们需要指定我们需要 Select(['ref']..
分页:
Update(
Select(['data', 0],
Paginate(Match(
Index("accounts_by_email"), "test@test.com"
))
),
{ data: { email: "testchanged@test.com"} }
)