我正在构建一个复杂的搜索查询,它允许用户同时搜索数据库中的多个值。该表单提交了所有字段(无论是否包含数据),看起来如下所示(简化):
{
"PartNumber": "000000",
"Requestor": "",
"Assigned" true
}
在上面的例子中,我正在搜索PartNumber
等于000000
且Assigned
等于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)
1条答案
按热度按时间ovfsdjhp1#
aql.literal
返回一个query
模板标记可以理解的对象,但这意味着实际上需要使用query
模板标记-即query
...而不是
...``: