我可以在一个请求中 运行 多个 faunadb 事务吗?
Can I run multiple faunadb transactions in the one request?
可以使用 Do
让 Fauna 按顺序执行表达式。但是,它在这种特殊情况下不起作用:
Do(
CreateCollection({ name: "users" }),
CreateIndex({
name: "users_by_email",
permissions: { read: "public" },
source: Collection("users"),
terms: [{field: ["data", "email"]}],
unique: true
})
)
我认为这是因为“索引 [...] 可能不是在与其源集合相同的事务中创建的。” https://docs.fauna.com/fauna/current/api/fql/functions/createindex?lang=javascript
如何在一个请求中高效地同时提交我的集合和索引创建命令?
直接回答标题问题:不是,一个“请求”就是一笔交易。
但是,正如您所指出的,可以在单个事务中执行多个 FQL 表达式,例如您使用 Do
函数。
Do
函数对您的示例不起作用的原因是 Fauna 查询执行程序在评估事务表达式时执行读取和聚合写入 intentions , 但 all 写入效果发生在事务结束时。这意味着在评估 CreateIndex
表达式时 collection 尚未完全写入,因此在需要时不存在 Collection("users")
。
这就是文档中存在警告的原因。您需要在一个事务中创建 collection,在另一个事务中创建索引。如果您正在部署已知模式,则可以在单个事务中创建所有 collection,并在一秒钟内创建所有索引。这是最佳实践答案。
但是,目前 API v4 可以通过使用 Let
函数来完成这项工作:
Let(
{
collection: CreateCollection({ name: "users" }),
collection_ref: Select("ref", Var("collection")),
},
CreateIndex({
name: "users_by_email",
source: Var("collection_ref"),
terms: [{field: ["data", "email"]}],
unique: true,
})
)
之所以可行,是因为索引的 source
字段需要有效引用。通过在命名变量中捕获 CreateCollection
的结果,可以通过变量在 CreateIndex
表达式中使用引用。
将来,查询执行器可能会升级,以验证source
字段中变量提供的所有引用的合法性。 If/when 如果发生这种情况,此技术将不再有效。 使用此技术需要您自担风险。
可以使用 Do
让 Fauna 按顺序执行表达式。但是,它在这种特殊情况下不起作用:
Do(
CreateCollection({ name: "users" }),
CreateIndex({
name: "users_by_email",
permissions: { read: "public" },
source: Collection("users"),
terms: [{field: ["data", "email"]}],
unique: true
})
)
我认为这是因为“索引 [...] 可能不是在与其源集合相同的事务中创建的。” https://docs.fauna.com/fauna/current/api/fql/functions/createindex?lang=javascript
如何在一个请求中高效地同时提交我的集合和索引创建命令?
直接回答标题问题:不是,一个“请求”就是一笔交易。
但是,正如您所指出的,可以在单个事务中执行多个 FQL 表达式,例如您使用 Do
函数。
Do
函数对您的示例不起作用的原因是 Fauna 查询执行程序在评估事务表达式时执行读取和聚合写入 intentions , 但 all 写入效果发生在事务结束时。这意味着在评估 CreateIndex
表达式时 collection 尚未完全写入,因此在需要时不存在 Collection("users")
。
这就是文档中存在警告的原因。您需要在一个事务中创建 collection,在另一个事务中创建索引。如果您正在部署已知模式,则可以在单个事务中创建所有 collection,并在一秒钟内创建所有索引。这是最佳实践答案。
但是,目前 API v4 可以通过使用 Let
函数来完成这项工作:
Let(
{
collection: CreateCollection({ name: "users" }),
collection_ref: Select("ref", Var("collection")),
},
CreateIndex({
name: "users_by_email",
source: Var("collection_ref"),
terms: [{field: ["data", "email"]}],
unique: true,
})
)
之所以可行,是因为索引的 source
字段需要有效引用。通过在命名变量中捕获 CreateCollection
的结果,可以通过变量在 CreateIndex
表达式中使用引用。
将来,查询执行器可能会升级,以验证source
字段中变量提供的所有引用的合法性。 If/when 如果发生这种情况,此技术将不再有效。 使用此技术需要您自担风险。