我正在构建一个复杂的搜索查询,它允许用户同时在多个值上搜索数据库。表单提交所有字段(不管是否保存数据),这些字段看起来类似于(简化):
{
"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)发布于 2020-07-30 13:34:15
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
`https://stackoverflow.com/questions/63161935
复制相似问题