ArangoDB AQL 片段问题
ArangoDB AQL Fragments Issue
我正在构建一个复杂的搜索查询,它允许用户同时搜索多个值的数据库。表单提交所有字段(无论是否保存数据),看起来像(简化):
{
"PartNumber": "000000",
"Requestor": "",
"Assigned" true
}
在上述情况下,我正在搜索 PartNumber
等于 000000
且 Assigned
等于 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
`
我正在构建一个复杂的搜索查询,它允许用户同时搜索多个值的数据库。表单提交所有字段(无论是否保存数据),看起来像(简化):
{
"PartNumber": "000000",
"Requestor": "",
"Assigned" true
}
在上述情况下,我正在搜索 PartNumber
等于 000000
且 Assigned
等于 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
`