ArangoDB AQL 片段问题

ArangoDB AQL Fragments Issue

我正在构建一个复杂的搜索查询,它允许用户同时搜索多个值的数据库。表单提交所有字段(无论是否保存数据),看起来像(简化):

{
  "PartNumber": "000000",
  "Requestor": "",
  "Assigned" true
}

在上述情况下,我正在搜索 PartNumber 等于 000000Assigned 等于 true 的数据库。由于 Requestor 是空的,我想忽略它。

我发现您可以构建 AQL Fragments,但我似乎无法让它们工作。我试过:

const query = `
  FOR part in ${parts}
    ${aql.literal(PartNumber ? `FILTER part.PartNumber == ${PartNumber}` : "")}
    ${aql.literal(Requestor ? `FILTER part.Requestor == ${Requestor}` : "")}
    ${aql.literal(Assigned ? `FILTER part.Assigned == ${Assigned}` : "")}
    RETURN part
`

const results = db._query(query)

但运气不好,我收到一个奇怪的错误: ArangoError: AQL: syntax error, unexpected :, expecting ] near ': 105600]

我一直在用头撞墙,是不是我遗漏了什么?

提前致谢!


编辑 - 附加测试

使用这个简单的查询:

const query = `
  FOR part in ${parts}
    ${aql.literal(PartNumber ? `FILTER part.PartNumber == "000000"` : "")}
    RETURN part
`

我 return 只是在到达数据库之前的查询,它显示: "\"\nFOR part in [ArangoCollection: 105600]\n[object Object]\nRETURN part\n\""

您可以看到 aql.literal() 是 returning [object Object] 我的条件。将其输出为字符串,它是 returning {}。变量 PartNumber 已定义,因此条件为真。


编辑 - 找到解决方案

这是有条件地使用多个字段的正确方法吗?

let query = `
  FOR part IN parts
    ${PartNumber ? `FILTER CONTAINS(part.PartNumber, "${PartNumber}")` : ""}
    ${Requestor ? `FILTER CONTAINS(part.Requestor, "${Requestor}")` : ""}
    RETURN part
`
const results = db._query(query)
res.send(results)

aql.literal returns 一个被 query 模板标签理解的对象,但这意味着您实际上需要使用 query 模板标签 - 即 query`...` 而不是 `...`:

const query = query`
  FOR part in ${parts}
    ${aql.literal(PartNumber ? `FILTER part.PartNumber == ${PartNumber}` : "")}
    ${aql.literal(Requestor ? `FILTER part.Requestor == ${Requestor}` : "")}
    ${aql.literal(Assigned ? `FILTER part.Assigned == ${Assigned}` : "")}
    RETURN part
`