FaunaDB:如何获取自定义列
FaunaDB: how to fetch a custom column
我正在学习 FaunaDB 和 FQL,遇到了一些麻烦(主要是因为我来自 MySQL)。我可以成功查询 table(例如: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') })
)
)
我如何在 FQL 中执行与 mySQL 查询 SELECT users.*, IF(users.expiry_date < NOW(), 1, 0) as is_expired FROM users
等效的操作?
您对 Let
和 Merge
的使用表明您对 FQL 的思考是好的。这些函数可以大大提高您的查询的条理性和可读性!
我将从一些笔记开始,但它们将与最终答案相关,所以请坚持下去。
Query
函数
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
Fauna 中的文档形状如下:
{
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
,这就是您正在寻找的功能。这是你用来抓取对象或数组的任何部分的东西。
这是一个为集合中的第 3 个用户获取邮政编码的人为示例:
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
}
)
如果您想合并它们,而不是将身份验证信息和用户作为单独的点返回 and/or 添加其他字段,然后随意这样做
// ...
Merge(
Select("data", Var("user_doc")), // just the data
{
user_id: Var("user_id"), // added field
has_expired: Var("has_expired") // added field
}
)
)
我正在学习 FaunaDB 和 FQL,遇到了一些麻烦(主要是因为我来自 MySQL)。我可以成功查询 table(例如: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') })
)
)
我如何在 FQL 中执行与 mySQL 查询 SELECT users.*, IF(users.expiry_date < NOW(), 1, 0) as is_expired FROM users
等效的操作?
您对 Let
和 Merge
的使用表明您对 FQL 的思考是好的。这些函数可以大大提高您的查询的条理性和可读性!
我将从一些笔记开始,但它们将与最终答案相关,所以请坚持下去。
Query
函数
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
Fauna 中的文档形状如下:
{
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
,这就是您正在寻找的功能。这是你用来抓取对象或数组的任何部分的东西。
这是一个为集合中的第 3 个用户获取邮政编码的人为示例:
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
}
)
如果您想合并它们,而不是将身份验证信息和用户作为单独的点返回 and/or 添加其他字段,然后随意这样做
// ...
Merge(
Select("data", Var("user_doc")), // just the data
{
user_id: Var("user_id"), // added field
has_expired: Var("has_expired") // added field
}
)
)