为所有活动项目创建索引

Creating an index for all active items

我有一组文档遵循此架构 {label: String, status: Number}

我想介绍一个新字段,deleted_at: Date 如果文档已被删除,它将保存信息。似乎是索引的完美用例,能够搜索所有未删除的任务。

CreateIndex({
  name: "activeTasks",
  source: Collection("tasks"),
  terms: [
    { field: ["data", "deleted_at"] }
  ]
})

然后按 shell 中的未定义/空值过滤:

Paginate(Match(Index("activeTasks"), null))
Paginate(Match(Index("activeTasks"), undefined))

return没什么,即使对于我明确将 deleted_at 设置为 null 的文档也是如此。 不过,这不是我的意思。我想获取根本没有定义 deleted_at 的文档,这样我就不必更新整个集合。

PS。当我在 deleted: "test" 处添加文档并查询它时,shell 会 return 预期结果。

我没有得到什么?

原因是因为 FaunaDB 不支持读取 empty/null 值的方式与您认为的一样。你需要使用一个特殊的 Bindings 来做到这一点。

确保查看 https://docs.fauna.com/fauna/current/tutorials/indexes/bindings.html#empty 以获得更详尽的解释和示例。

我对绑定工作原理的理解会产生以下代码。不过我还没有测试过,我不确定它是否有效。

您需要一个特殊的绑定索引:

CreateIndex({
  name: "activeTasks",
  source: [{
    collection: Collection("tasks"),
    fields: {
      null_deleted_at: Query(
        Lambda(
          "doc",
          Equals(Select(["data", "deleted_at"], Var("doc"), null), null)
        )
      )
    }
  }],
  terms: [ {binding: "null_deleted_at"} ],
})

用法:

Map(
  Paginate(Match(Index("activeTasks"), true)),
  Lambda("X", Get(Var("X")))
)