ArangoDB AQL片段问题

vaqhlq81  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(193)

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

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

在上面的例子中,我正在搜索PartNumber等于000000Assigned等于true的数据库。由于Requestor为空,我希望忽略它。
我发现你可以构建AQL片段,但是我似乎无法让它们工作。我尝试过:

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
`

我只是在查询到达数据库之前返回它,它显示:"\"\\nFOR part in [ArangoCollection: 105600]\\n[object Object]\\nRETURN part\\n\""
你可以看到aql.literal()返回的是[object Object]作为我的条件。输出这个字符串,它返回的是{}。变量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)
ovfsdjhp

ovfsdjhp1#

aql.literal返回一个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
`

相关问题