如何在 Fauna 的 collection 文档中按数据查询?

How to query by data within a collection document in Fauna?

我正在寻找一种方法来查询所有使用索引 users_filtered if isApproved: true 的用户。我在 Next.js 项目中使用 Fauna 作为数据库。我在 Fauna 数据库中添加了 isApproved 作为索引 users_filtered 的术语。

以下是用户 collection:

中的文档示例
{
  "ref": Ref(Collection("users"), "328571711165938374"),
  "ts": 1649676683111000,
  "data": {
    "givenName": "Leo",
    "familyName": "Deo",
    "isApproved": true
  }

这是我当前的函数,它使用索引 users_filtered

查询所有文档
const getFilteredUsers = async () => {
  const { data } = await faunaClient.query(
    q.Map(
      q.Paginate(q.Match(q.Index("users_filtered"))),
      q.Lambda("userRef", q.Get(q.Var("userRef")))
    )
  )

  const filtered = data.map((x) => {
    x.data.id = x.ref.value.id
    x.data.ts = x.ts
    return x.data
  })
  return filtered
}

索引定义:

来源Collection:用户

索引名称:users_filtered

条款:已批准

值:None 已定义

如何查询包含 isApproved: true 的所有文档?

您的索引定义似乎有点奇怪。看起来您正在报告仪表板中显示的值,但如果是这样,则 terms 定义不正确:它应该是 data.isApproved。通过 FQL,您应该看到如下内容:

> Get(Index("users_filtered"))
{
  ref: Index("users_filtered"),
  ts: 1649779238270000,
  active: true,
  serialized: true,
  name: "users_filtered",
  unique: false,
  source: Collection("users"),
  terms: [
    {
      field: ["data", "isApproved"]
    }
  ],
  partitions: 1
}

如果您不小心遗漏了 data.,那么您的索引定义可能是正确的,您应该能够继续。

当索引具有 terms 定义时,该定义指定了如何搜索索引。使用 isApproved 字段作为术语,然后您必须指定要在 Match 表达式中查找的 isApproved 的哪个值。例如:

  const { data } = await faunaClient.query(
    q.Map(
      q.Paginate(q.Match(q.Index("users_filtered"), true)),
      q.Lambda("userRef", q.Get(q.Var("userRef")))
    )
  )

当我创建您描述的用户文档时,查询的结果是:

{
  data: [
    {
      ref: Ref(Collection("users"), "328750455338304000"),
      ts: 1649779715770000,
      data: { givenName: 'Leo', familyName: 'Deo', isApproved: true }
    }
  ]
}