AQL中的Arangodb LET变量用于过滤器
我有收集“通知”。 给定此集合的以下示例文档:AQL中的Arangodb LET变量用于过滤器,arangodb,aql,nosql,Arangodb,Aql,Nosql,我有收集“通知”。 给定此集合的以下示例文档: { "timestamp": 1413543986, "message": "message", "readed": { "user_8": 0, "user_9": 0, "user_22": 0 }, "type": "1014574149174" } 我尝试查找具有以下AQL的此文档: FOR n IN Notifier LET usersFound = TO_BOOL( FOR
{
"timestamp": 1413543986,
"message": "message",
"readed": {
"user_8": 0,
"user_9": 0,
"user_22": 0
},
"type": "1014574149174"
}
我尝试查找具有以下AQL的此文档:
FOR n IN Notifier
LET usersFound = TO_BOOL(
FOR user IN n.readed
FILTER user == 'user_8'
LIMIT 1
RETURN user
)
FILTER usersFound==true
RETURN n
我得到以下错误:
[1501]语法错误,声明意外,应为)接近“或”
n.readed中的用户
过滤…'在位置3:10
如何使用LET正确编写此AQL?您的查询几乎正确,有两个小问题 1) TO_BOOL()是触发相应编码函数的字符,现在需要插入一个子查询,该子查询通过将AQL语句包装到附加()中来触发。 因此,您必须使用:TO_BOOL((AQL)),而不是TO_BOOL(AQL) 2) readed是一个JSON对象,对于x,它期望一个列表。在迭代n.readed的属性时,可以在此处使用属性(n.readed) 以下是您的示例的正确解决方案:
FOR n IN Notifier
LET usersFound = TO_BOOL(
(FOR user IN ATTRIBUTES(n.readed)
FILTER user == 'user_8'
LIMIT 1
RETURN user)
)
FILTER usersFound==true
RETURN n
附言:
如果您只查找某个属性的存在性,而不想进行进一步的筛选,则可以使用HAS更轻松地实现这一点:
FOR n IN Notifier
LET usersFound = HAS(n.readed, 'user_8')
FILTER usersFound==true
RETURN n
如果您只是在寻找某个字段的存在,该字段的值可以转换为布尔值,则不需要使用LET和子查询。以下查询使用HAS函数确定文档中是否存在指定字段,并使用BOOL将其值转换为布尔表示形式:
LET search = 'user_8'
FOR n IN Notifier
FILTER HAS(n.readed, search) == true && TO_BOOL(n.readed[search])
RETURN n