我可以在一个请求中 运行 多个 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 如果发生这种情况,此技术将不再有效。 使用此技术需要您自担风险