- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,假设我们有一个包含数十万份客户文档的集合,其中包含 3 个字段:name、monthly_salary 和 age。
如何查询monthly_salary大于2000,age大于30的文档?
在 SQL 中,这很简单,但对于 Fauna,我很难理解最佳方法,因为索引项仅适用于完全匹配。我在文档中看到我可以使用 Filter 函数,但我需要提前获取所有文档,所以它看起来有点违反直觉而且性能不佳。
下面是我如何实现它的示例,但不确定这是否是最佳方法,尤其是当它包含大量记录时。
Map(
Filter(
Paginate(Documents(Collection('clients'))),
Lambda(
'client',
And(
GT(Select(['data', 'monthly_salary'], Get(Var('client'))), 2000),
GT(Select(['data', 'age'], Get(Var('client'))), 30),
)
)
),
Lambda(
'filteredClients',
Get(Var('filteredClients'))
)
)
这是正确的还是我遗漏了一些关于动物群和 FQL 的基本概念?谁能帮忙?
提前致谢
最佳答案
使用索引执行高效搜索。您可以查看 search with Indexes 的文档, 和 there is a "cookbook"对于一些不同的搜索示例。
有两种使用索引进行搜索的方式,使用哪种方式取决于您搜索的是equality(完全匹配)还是inequality(大于或等于小于,例如)。
如果您需要完全匹配,请使用索引术语。这在文档中是最明确的,这也不是您最初的问题所在,因此我不会在这里过多赘述。但这里有一个简单的例子
给定具有这种形状的用户文档
{
ref: Ref(Collection("User"), "1234"),
ts: 16934907826026,
data: {
name: "John Doe",
email: "jdoe@example.com,
age: 50,
monthly_salary: 3000
}
}
和如下定义的索引
CreateIndex({
name: "users_by_email",
source: Collection("User"),
terms: [ { field: ["data", "email"] } ],
unique: true // user emails are unique
})
您可以搜索与...完全匹配的 Match
function !
Get(
Match(Index("user_by_email"), "jdoe@example.com")
)
寻找不等式更有趣也更复杂。它需要使用 Index values 和 Range
function .
根据上面的文档,我们可以创建一个新的索引
CreateIndex({
name: "users__sorted_by_monthly_salary",
source: Collection("User"),
values: [
{ field: ["data", "monthly_salary"] },
{ field: ["ref"] }
]
})
请注意,我没有在上面的索引中定义任何术语
。对于不等式,重要的还是值
。我们还将 ref 作为一个值包含在内,因为我们稍后会需要它。
现在我们可以使用Range
来获取给定范围内的所有用户的薪水。此查询将获取薪水从 2000 开始及以上的所有用户。
Paginate(
Range(
Match(Index("users__sorted_by_monthly_salary")),
[2000],
[]
)
)
对于“或”操作,使用 Union
function .对于“AND”操作,使用 Intersection
function .
Match
和 Range
等函数返回集合。其中一个非常重要的部分是确保当您将 Set 与 Intersection
等函数“组合”时,数据的形状是相同的。
对于没有值
的索引,使用相同形状的集合并不困难,它们默认为相同的单个引用值。
Paginate(
Intersection(
Match(Index("user_by_age"), 50), // type is Set<Ref>
Match(Index("user_by_monthly_salary, 3000) // type is Set<Ref>
)
)
当 Set 具有不同的形状时,它们需要修改,否则 Intersection 将永远不会返回结果
Paginate(
Intersection(
Range(
Match(Index("users__sorted_by_age")),
[30],
[]
), // type is Set<[age, Ref]>
Range(
Match(Index("users__sorted_by_monthly_salary")),
[2000],
[]
) // type is Set<[salary, Ref]>
)
)
{
data: [] // Intersection is empty
}
那么我们如何改变 Set 的形状使它们相交呢?我们可以使用 Join
function , 以及 Singleton
function .
Join
将对 Set 中的所有条目运行操作。我们将使用它来仅返回一个引用。
Join(
Range(Match(Index("users__sorted_by_age")), [30], []),
Lambda(["age", "ref"], Singleton(Var("ref")))
)
总而言之:
Paginate(
Intersection(
Join(
Range(Match(Index("users__sorted_by_age")), [30], []),
Lambda(["age", "ref"], Singleton(Var("ref")))
),
Join(
Range(Match(Index("users__sorted_by_monthly_salary")), [2000], []),
Lambda(["age", "ref"], Singleton(Var("ref")))
)
)
)
当提供不同的术语时,您可以使用额外的逻辑来组合不同的索引,或者使用绑定(bind)搜索缺失的字段。您可以做很多很酷的事情。
请查看 cook book和 Fauna forums以及想法。
这是个好问题!
考虑一下:由于 Fauna 是作为无服务器 API 提供的,因此您需要为文档和索引上的每个单独读取和写入以及执行查询的计算时间付费。 SQL 可以简单得多,但它是一种高级得多的语言。 SQL 的背后是一个查询规划器,它对如何获取数据做出假设。如果它不能有效地执行此操作,它可能会默认扫描您的整个数据表或以其他方式执行比您预期的成本高得多的操作。
有了 Fauna,您就是查询规划师。这意味着开始要复杂得多,但这也意味着您可以很好地控制数据库的性能,从而控制成本。
我们正在努力改进定义架构和您需要的索引的体验,但目前您必须在低级别定义这些查询。
关于faunadb - 如何在 Fauna DB 上高效查询和过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69065039/
想知道是否faunadb支持实时,这是一件大事firebase支持? 我注意到 faunadb支持 graphql但没有 subscription支持的。 对不起,如果这个问题很幼稚? 最佳答案 截至
有没有办法统计 FaunaDB 集合中的所有文档? 假设我有一个 users集合,我定义了一个 all_users指数。计算 users 中所有文档的最佳方法是什么?在数据库中收集? 更新:扩展下面@
是否可以通过 fauna-shell 或 fauna-java API 获取 FaunaDB 类模式或字段? 我期待给定类或实例的字段及其数据类型 最佳答案 Fauna 没有将模式强制融入其中,因此了
我找不到任何有关如何在 FaunaDB 中执行此类查询的信息。我只需要从文档中选择特定字段,而不是所有字段。我可以使用 Select 函数选择一个字段,如下所示: serverClient.query
我有一个 FaunaDB 数据库“RaspberryPi”及其子数据库“00000000790f4c7c”,如下所示: 那么如何打开子数据库“00000000790f4c7c”? 我尝试打开 0000
尝试更新文档(如果存在),否则创建具有相同数据的文档。我还需要使用 Index 而不是直接的 Ref 来做到这一点。 在我确定它已经存在的情况下,使用它来更新。但是在这种情况下,由于无法确定 Ref
FaunaDB的documentation涵盖了如何更新文档,但他们的示例假定我将拥有 id进入 Ref : Ref(schema_ref, id) client.query( q.Update(
我试图增进对FaunaDB的理解。 我有一个包含如下记录的集合: { "ref": Ref(Collection("regions"), "261442015390073344"), "ts"
在类中(在数据库中)拥有现有数据......我无法创建索引(类型为“all”)并返回在创建新索引之前插入的数据。 我试图以编程方式(python)和通过网络界面来完成。 我希望能够在创建新索引时恢复预
任何人都知道如何创建一个索引,其中术语是一个 ref 并且可以通过数组中的嵌套对象进行搜索? 在“对话”集合中,我保存了以下示例数据: { "created": Time("2019-09-29T
我不知道如何简单地获取使用 faunadb 创建的最后一个实例的 ref(id)。 我需要把它放在一个网址中。 我用它来创建我的实例: /* code from functions/todos-cre
我有一个 FaunaDB,我想将其作为文档存储进行交互。我有一个 api: 从 FaunaDB 读取整个文档 根据对 api 的输入任意改变该数据 写回变异的同时保证数据没有被变异 如果尝试写入时读取
我正在构建一个包含一些相互关联的集合(任务、组和用于存储任务 ID 和顺序的列)的待办事项列表。这些中的每一个都需要缩小到登录用户的范围,所以我有索引来获取_by_owner(所有者是术语)。 我想确
我有一个类“posts”,它有 10 个实例。如何在不使用分页方法的情况下使用 fauna-java 库获取并列出此类中的所有实例? 我试过如下的东西 client.query(Get(Class("
FaunaDB 允许我按各个字段索引数据项,并通过索引分页,但我看不到选择随机项的方法。 最佳答案 在任何数据库中,大规模地选择随机项目都是困难的。根据您的要求,有两种主要技术可供选择。 为您的查询定
我有一个包含时间类型字段的集合。我需要能够按年或月-年组合查询此集合。 我曾尝试在网站本身上使用索引创建工具,例如 Year(data.expDate)和 Month(data.expDate)在条款
作为 FaunaDB documentation ,好像没有dart API,也没有REST API。另外,我在 Flutter Packages 中找不到 FaunaDB 包。 . 有没有办法在fl
我正在从 faunadb 获取文档,我希望他们的 ID 包含在我发送给客户端的有效负载中。 这就是我获取文档并将其数据作为集合返回的方式 serverClient.query( q.Map(
也许我还没有掌握GraphQL,但是我想更新数据库中的一条复杂记录。我找不到解释这个的文档,它没有使用一个简单的例子。我正在使用 FaunaDB 并尝试在 GraphQL playground 中测试
例如,假设我们有一个包含数十万份客户文档的集合,其中包含 3 个字段:name、monthly_salary 和 age。 如何查询monthly_salary大于2000,age大于30的文档? 在
我是一名优秀的程序员,十分优秀!