【问题标题】:AQL filter by array of IDsAQL 按 ID 数组过滤
【发布时间】:2017-11-07 23:59:33
【问题描述】:

如果我需要按 ID 数组进行过滤,我将如何使用绑定来做到这一点? 文档没有提供任何提示。

for c in commit
filter c.hash in ['b0a3', '9f0eb', 'f037a0']
return c

【问题讨论】:

  • “使用绑定”是指如何使用绑定参数而不是数组字面量['b0a3', '9f0eb', 'f037a0']
  • 是的,这正是我的意思@CoDEmanX。像 for c in commit filter c.hash in @hashes return cfor c in commit filter c.hash in [@hashes] return c 这样的东西现在我的工作是#2,但它在实现上看起来很脏。

标签: arangodb aql


【解决方案1】:

更新答案以处理我错过的绑定参考。

LET commit = [
    { name: "111", hash: "b0a3" },
    { name: "222", hash: "9f0eb" },
    { name: "333", hash: "asdf" },
    { name: "444", hash: "qwer" },
    { name: "555", hash: "f037a0" }
]

FOR c IN commit
FILTER c.hash IN @hashes
RETURN c

关键是当你发送绑定参数@hashes时,它需要是一个数组,而不是包含数组的字符串。

如果您通过 ArangoDB 管理工具使用 AQL 查询工具,请确保单击右上角的“JSON”按钮以确保参数 hashes 具有值
["b0a3", "9f0eb", "f037a0"] 而不是
"['b0a3', '9f0eb', 'f037a0']"

如果你想发送一个字符串作为参数,例如"b0a3","9f0eb","f037a0",所以{ "hashes": "\"b0a3\",\"9f0eb\",\"f037a0\"" }作为绑定参数,那么你可以将字符串拆分成这样的数组:

LET commit = [
    { name: "111", hash: "b0a3" },
    { name: "222", hash: "9f0eb" },
    { name: "333", hash: "asdf" },
    { name: "444", hash: "qwer" },
    { name: "555", hash: "f037a0" }
]

FOR c IN commit
FILTER c.hash IN REMOVE_VALUE(SPLIT(@hashes, ['","', '"']), "")
RETURN c

此示例将使用","" 作为分隔符将字符串@hashes 然后SPLIT 内容。这会将输入变量转换为数组,然后查询按预期工作。它还将命中hash 属性上的索引。

分隔符用单引号括起来以避免转义,这也是可能的,但可读性较差:["\",\"", "\""]

请注意,"," 首先作为分隔符列出,因此 SPLIT 的结果是
[ "", "9f0eb", "b0a3", "f037a0" ] 而不是
[ "", ",", "9f0eb", "b0a3", "f037a0" ]

绑定参数值中的第一个双引号引起的空字符串元素,这会使查询返回空字符串作为哈希的提交记录,可以使用REMOVE_VALUE消除。

推荐的方法是将["b0a3", "9f0eb", "f037a0"]作为数组传递,但是如开头所示。

【讨论】:

  • c.hash 只是一个字符串。我的查询旨在从作为输入参数传递的哈希数组中返回带有哈希的提交。这就是为什么我提到bindings,或者使用绑定参数。
  • 添加了一张图片来展示 JSON 在 Web UI 中的区别。在第二个示例中更改了分隔符的顺序,使用字符串作为绑定参数值以避免元素 "," 并添加 REMOVE_VALUE() 以摆脱 "" 元素,这可能会给您不同的查询结果。此外,如果您在 AQL 中使用单引号,则不需要转义双引号,这样可读性要好得多。
【解决方案2】:

像这样:

with person FOR id in ["person/4201061993070840084011","person/1001230840198901011999","person/4201008406196506156918"]
FOR v,e,p In 1..1 ANY id
relation_samefamily,stay,relation_internetbar,relation_flight,relation_train
OPTIONS {
    bfs:true 
} 
FILTER (p.edges[*]._from ALL IN  ["person/42010619930708400840084011","person/10012310840989084001011999","person/4201060840196506156918"] and p.edges[*]._to ALL IN  ["person/4201061993070808404011","person/1001231908408901011999","person/4200840106196506156918"]) 
RETURN {v,e}

【讨论】:

  • 不鼓励使用纯代码的答案。请单击编辑并添加一些词来总结您的代码如何解决问题,或者解释您的答案与之前的答案/答案有何不同。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多