复杂FQL过滤器问题-大于等于的交集

凯斯顿
  1. 在FaunaDB中,最有效的最佳方法是什么?
SELECT * FROM emp WHERE sal >= 2000 AND deptno = 10

2.可以使用intersection()函数来完成#1吗?

  1. 如果要在下面的查询中使用FQL如何完成?
SELECT * FROM emp WHERE (sal >= 2000 OR sal < 500) AND deptno = 10
  1. FQL中的该查询如何?
SELECT * FROM emp WHERE (sal >= 2000 OR sal < 500) AND deptno = 10 AND age > 21
棕色
  1. 在FaunaDB中,最有效的最佳方法是什么?

可以使用Range函数完成该查询,前提是您具有以下索引:

> CreateIndex({
  name: "sal_by_deptno",
  source: Collection("emp"),
  terms: [ { field: ['data', 'deptno'] } ],
  values: [ { field: ['data', 'sal'] }, { field: 'ref' } ]
})

您可以这样查询:

> Paginate(Range(Match(Index("sal_by_deptno"), 10), [2000], []))
{
  data: [
    [ 2000, Ref(Collection("emp"), "260259607265411603") ],
    [ 3000, Ref(Collection("emp"), "260259610695303699") ]
  ]
}
  1. 可以使用intersection()函数完成#1吗?

交集(和其他集合函数)仅在所有操作数具有相同格式的情况下才起作用,因此我认为在这种情况下它将不有用。

  1. 如果要在下面的查询中使用FQL如何完成?
Paginate(
  Union(
    Range(Match(Index("sal_by_deptno"), 10), [2000], []),
    Range(Match(Index("sal_by_deptno"), 10), [], [499.99])
  )
)

等效于并集,因此这是您应在该上下文中使用的功能。请记住,范围函数是包含在内的,因此要模拟<运算符,我必须使用小于500的值

  1. FQL中的该查询如何?

那您需要第二个索引,然后使用Join函数

CreateIndex({
  name: "age_by_ref",
  source: Collection("emp"),
  terms: [{field: 'ref'}],
  values: [{field: ['data', 'age']}, {field: 'ref'}]
})

然后查询:

Paginate(
  Join(
    Union(
      Range(Match(Index("sal_by_deptno"), 10), [2000], []),
      Range(Match(Index("sal_by_deptno"), 10), [], [499.99])
    ),
    Lambda((sal, ref) => Range(Match(Index("age_by_ref"), ref), [22], []))
  )
)

上面的解决方案决不是绝对的解决方案,这只是我回答此问题时突然想到的一种可能的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章