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 等效的操作?

您对 LetMerge 的使用表明您对 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
    }
  )
)