繁体   English   中英

ArangoDB AQL 片段问题

[英]ArangoDB AQL Fragments Issue

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

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

在上述情况下,我正在搜索PartNumber等于000000Assignedtrue的数据库。 由于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)

aql.literal返回query模板标签可以理解的 object,但这意味着您实际上需要使用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
`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM