我刚刚学习 FaunaDB 和 FQL,遇到了一些麻烦(主要是因为我来自 MySQL)。我可以成功查询表(例如: users
)并获取特定用户。该用户拥有一个属性users.expiry_date
这是一个faunadb Time()
类型。
我想做的是使用函数 LT(Now(), users.expiry_date)
知道该日期是否已过期,但我不知道如何创建这个查询。我是否必须创建一个 Index
首先?
简而言之,只需获取 users
之一文件让我得到这个:
{
id: 1,
username: 'test',
expiry_date: Time("2022-01-10T16:01:47.394Z")
}
但我想得到这个:
{
id: 1,
username: 'test',
expiry_date: Time("2022-01-10T16:01:47.394Z"),
has_expired: true,
}
我现在有这个 FQL 查询(忽略 oauthInfo
):
Query(
Let(
{
oauthInfo: Select(['data'], Get(Ref(Collection('user_oauth_info'), refId))),
user: Select(['data'], Get(Select(['user_id'], Var('oauthInfo'))))
},
Merge({ oauthInfo: Var('oauthInfo') }, { user: Var('user') })
)
)
我将如何执行与 mySQL 查询等效的操作 SELECT users.*, IF(users.expiry_date < NOW(), 1, 0) as is_expired FROM users
在 FQL 中?
最佳答案
您对 Let
和 Merge
的使用表明您正在以良好的方式考虑 FQL。这些函数可以大大提高您的查询的组织性和可读性!
我将从一些注释开始,但它们将与最终答案相关,所以请跟着我。
查询
函数
https://docs.fauna.com/fauna/current/api/fql/functions/query
首先,您不需要在此处的 Query
函数中包装任何内容。 Query
对于在 FQL 中定义稍后运行的函数是必要的,例如,在用户定义函数 body
中。您将始终将其视为Query(Lambda(...))
。
动物群 ID
https://docs.fauna.com/fauna/current/learn/understanding/documents
请记住,Fauna 会为您为每个文档分配唯一的 ID。当我看到名为 id
的字段时,这是一个危险信号,因此我想强调这一点。您可能会在文档中存储某些企业 ID 的原因有很多,但请确保您需要它。
获取 ID
动物群中的文档形状如下:
{
ref: Ref(Collection("users"), "101"), // <-- "id" is 101
ts: 1641508095450000,
data: { /* ... */ }
}
在 JS 驱动程序中,您可以通过使用 documentResult.ref.id
使用此 id(其他驱动程序可以以类似的方式执行此操作)
您也可以直接在 FQL 中访问 ID。您使用Select
功能。
Let(
{
user: Get(Select(['user_id'], Var('oauthInfo')))
id: Select(["ref", "id"], Var("user"))
},
Var("id")
)
有关 Select
函数的更多信息。
https://docs.fauna.com/fauna/current/api/fql/functions/select
您已经在使用Select
,这就是您正在寻找的功能。您可以使用它来抓取对象或数组的任何部分。
这是一个人为的示例,用于获取集合中第三个用户的邮政编码:
Let(
{
page: Paginate(Documents(Collection("user")),
},
Select(["data", 2, "data", "address", "zip"], Var("user"))
)
把它放在一起
也就是说,您的 Let
函数是一个很好的开始。让我们把事情分解成更小的步骤。
Let(
{
oauthInfo_ref: Ref(Collection('user_oauth_info'), refId)
oauthInfo_doc: Get(Var("oathInfoRef")),
// make sure that user_oath_info.user_id is a full Ref, not just a number
user_ref: Select(["data", "user_id"], Var("oauthInfo_doc"))
user_doc: Get(Var("user_ref")),
user_id: Select("id", Var("user_ref")),
// calculate expired
expiry_date: Select(["data", "expiry_date"], Var("user_doc")),
has_expired: LT(Now(), Var("expiry_date"))
},
// if the data does not overlap, Merge is not required.
// you can build plain objects in FQL
{
oauthInfo: Var("oauthInfo_doc"), // entire Document
user: Var("user_doc"), // entire Document
has_expired: Var("has_expired") // an extra field
}
)
如果您确实想要合并身份验证信息和用户和/或添加其他字段,则不要将它们作为单独的点返回,而是随意执行此操作
// ...
Merge(
Select("data", Var("user_doc")), // just the data
{
user_id: Var("user_id"), // added field
has_expired: Var("has_expired") // added field
}
)
)
关于FaunaDB:如何获取自定义列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70655090/