- 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/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!