如何在 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 }
}
]
}
我正在寻找一种方法来查询所有使用索引 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 }
}
]
}