FaunaDB:如何获取自定义列

标签 faunadb

我刚刚学习 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 中?

最佳答案

您对 LetMerge 的使用表明您正在以良好的方式考虑 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/

相关文章:

faunadb - 我可以在不知道其 ID 的情况下更新 FaunaDB 文档吗?

go - 我可以使用Go API一击而获得一个动植物数据库文档的json数据吗?

faunadb - 如何在动物群中按多个条件查询?

python - 如何将集合附加到数据库?

javascript - 更新 FaunaDB 中的记录时,如何在不传入每个字段和子对象的情况下更新一个字段?

javascript - 如何增加动物区的值(value)?使用 javascript 和服务器端函数

faunadb - 如何创建具有实例的索引?

consistency - 覆盖过去读取的文档时保证 FaunaDB 的一致性

javascript - 如何从 HTML 页面访问 FaunaDB?

javascript - 在特定子数据库中创建集合