【问题标题】:Creating an index for all active items为所有活动项目创建索引
【发布时间】:2021-06-23 18:45:33
【问题描述】:

我有一组遵循此架构 {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))

即使对于我将deleted_at 明确设置为null 的文档,它也不会返回任何内容。 不过,这不是我的意思。我想获取根本没有定义 deleted_at 的文档,这样我就不必更新整个集合。

PS。当我在deleted: "test" 添加文档并查询它时,shell 确实返回了预期的结果。

我没有得到什么?

【问题讨论】:

  • 我不知道 Animaldb 但可能有错字 { field: ["data", "deleted_at"] } 应该是 { field: ["date", "deleted_at"] } 否?
  • @Zerowiel 实际上是正确的,因为 FaunaDB 将所有“自定义”数据存储在“数据”键中。

标签: faunadb


【解决方案1】:

原因是因为 FaunaDB 不支持像您认为的那样读取空/空值。您需要使用特殊的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")))
)

【讨论】:

  • 谢谢,它“开箱即用”。我匆匆浏览文档只是为了进行“基本”设置。虽然这仅在 SQL 领域是基本的。
猜你喜欢
  • 2015-11-17
  • 2017-11-12
  • 2014-04-09
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多