我可以运行多个faunadb事务在一个请求吗?



可以让Fauna使用Do顺序执行表达式。但是,它在这个特殊的情况下不起作用:

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

我如何有效地提交我的收集和索引创建命令一起在一个请求?

直接回答标题问题:No。一个"request"是一个事务。

但是,正如您所注意到的,在单个事务中执行多个FQL表达式是可能的,例如您使用的Do函数。

Do函数不适合您的示例的原因是,Fauna查询执行器执行读取和聚合写意图作为事务表达式的评估,但所有写入效果发生在事务结束时。这意味着在计算CreateIndex表达式时还没有完全写入集合,因此在需要Collection("users")时不存在。

这就是文档中存在警告的原因。您需要在一个事务中创建集合,在另一个事务中创建索引。如果您正在部署一个已知的模式,那么您可以在一个事务中创建所有集合,并在一秒钟内创建所有索引。这是最佳实践答案。

然而,目前可以使用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字段中变量提供的所有引用的合法性。如果发生这种情况,这种技术将不再起作用。使用此技术风险自负.