首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从FaunaDB中的集合中获取所有文档?

如何从FaunaDB中的集合中获取所有文档?
EN

Stack Overflow用户
提问于 2020-04-28 19:22:38
回答 2查看 7.9K关注 0票数 13

我已经有了答案:

代码语言:javascript
复制
const faunadb = require('faunadb')
const q = faunadb.query

exports.handler = async (event, context) => {
  const client = new faunadb.Client({
    secret: process.env.FAUNADB_SERVER_SECRET
  }) 

  try {  
    // Getting the refs with a first query
    let refs = await client.query(q.Paginate(q.Match(q.Index('skus'))))
    // Forging a second query with the retrieved refs
    const bigQuery = refs.data.map((ref) => q.Get(ref))
    // Sending over that second query
    let allDocuments = await client.query(bigQuery)
    // All my documents are here!
    console.log('@allDocuments: ', allDocuments);
    //...
  } catch (err) {
    // ...
  }
}

但我发现这并不令人满意,因为我正在对一个似乎是最琐碎的DB调用进行2次查询。对我来说,这似乎既低效又冗长。

由于我只是在学习FaunaDB,这里可能有些东西我没有领会。我的问题可以分成三个部分:

  • 可以在一个调用中查询所有文档吗?如果不是
  • ,为什么不能?这种设计背后的逻辑是什么?
  • 我可以在没有索引的情况下进行这样的查询吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-28 20:00:02

FaunaDB的FQL语言非常类似于JavaScript (如果您想要执行条件事务等等,这会有很大帮助)。

本质上,FaunaDB也有一个Map。考虑到索引只包含一个,即引用,您可以编写以下内容:

代码语言:javascript
复制
q.Map(
  q.Paginate(q.Match(q.Index('skus'))),
  q.Lambda(x => q.Get(x))
)

对于这种特殊情况,实际上不需要索引,因为每个集合都有一个内置的默认索引,可以通过‘Document’函数执行select all。

代码语言:javascript
复制
q.Map(
  q.Paginate(q.Documents(q.Collection('<your collection>'))),
  q.Lambda(x => q.Get(x))
)

现在,如果您使用的索引返回多个值(因为您希望对‘ref’以外的内容进行排序),那么您需要向Lambda提供与索引中定义的值数量相同的参数。假设我的索引在值中包含tsref,因为我希望及时对它们进行排序,那么获取所有值的查询如下:

代码语言:javascript
复制
q.Map(
  q.Paginate(q.Match(q.Index('<your index with ts and ref values>'))),
  q.Lambda((ts, ref) => q.Get(ref))
)

值用于范围查询/排序,但也定义索引返回的内容。

回到你的问题:

-我可以在一个调用中查询所有文档吗?

当然,我建议你这样做。请注意,您将获得的文档将自动分页。您可以通过提供一个参数来设置页面大小,并在页面更大的情况下返回一个'after‘或’case‘属性。之后或之前的内容可以作为参数再次显示给page函数,以获得下一页或上一页:https://docs.fauna.com/fauna/current/api/fql/functions/paginate

-我可以在没有索引的情况下进行这样的查询吗?

没有,但是您可以使用上面解释过的内置索引。FaunaDB保护用户在没有索引的情况下进行查询。因为它是一个可伸缩的数据库,可以包含大量的数据,而且是按劳分配的,所以防止用户对自己开枪是个好主意:)。分页和强制索引有助于做到这一点。

为什么FQL是不同的。FQL是一种不像许多查询语言那样具有声明性的语言。相反,这是过程性的,您可以精确地编写如何获取数据。这具有以下优点:

通过编写如何检索数据的

  1. ,您可以准确地预测查询在随付即付系统中的行为方式。
  2. --这种语言可以用于安全规则或复杂的条件事务(根据特定条件更新某些实体或不同集合上的许多实体)。在动物群中,很常见的是编写一个查询,它在一个transaction.
  3. Our风格的“存储过程”中做了很多事情,称为用户定义函数,它只是用FQL而不是另一种语言编写的。

在本教程中还将讨论查询,该教程附带了GitHub存储库中的代码,这可能会给您提供更完整的图片:https://css-tricks.com/rethinking-twitter-as-a-serverless-app/

票数 22
EN

Stack Overflow用户

发布于 2020-04-28 20:11:35

--我可以在一个调用中查询所有文档吗?

是的,如果你的收藏不多的话。Paginate函数默认为每页获取64个文档。您可以调整页面大小,最多可调整100,000个文档。如果集合有超过10万个文档,则必须执行多个查询,使用游标获取后续文档。

有关详细信息,请参阅分页教程:https://docs.fauna.com/fauna/current/tutorials/indexes/pagination

如果不是

,为什么不呢?这种设计背后的逻辑是什么?

对于SQL数据库来说,SELECT * FROM table既方便,也可能是资源噩梦。如果表包含数十亿行,尝试为该查询提供结果可能会消耗服务器和/或客户端上的可用资源。

动物群是一个共享的数据库资源。我们希望对任何具有数据库的用户进行良好的查询,这要求我们对任何单个事务所涉及的文档数量设置合理的限制。

,我可以在没有索引的情况下进行这样的查询吗?

不,也是。

从动物群中检索多个结果需要一个索引,除非您是独立地跟踪文档的引用。但是,使用Documents函数,Fauna维护一个内部索引,因此您不需要创建自己的索引来访问集合中的所有文档。

有关详细信息,请参阅文档参考页:https://docs.fauna.com/fauna/current/api/fql/functions/documents

返回到示例代码,您正在执行两个查询,但可以轻松地将它们合并为一个查询。FQL是高度可合成的。例如:

代码语言:javascript
复制
let allDocuments = await client.query(
  q.Map(
    q.Paginate(q.Documents(q.Collection("skus"))),
    q.Lambda("X", q.Get(q.Var("X")))
  )
)

你认为FQL是冗长的,这是正确的。许多函数式语言都表现出这种语言的文字性。优点是任何接受表达式的函数都可以任意组合。我们的电子商务教程提供了一个最好的可组合性示例,以及如何管理文档间引用,特别是描述submit_order函数的部分:https://docs.fauna.com/fauna/current/tutorials/ecommerce#function

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61488323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档