我有'Notifier'集合。 鉴于此集合的以下示例文档:
{
"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]语法错误,意外的FOR声明,期待)'或'附近 用户IN n.readed FILT ......'位置3:10
如何使用LET正确编写此AQL?
答案 0 :(得分:5)
您的查询几乎正确,有2个小问题。
1)TO_BOOL()是用于触发correspoding函数的字符,您现在要插入一个子查询,该子查询是通过在Additional()中包装AQL语句来触发的。 因此,您必须使用TO_BOOL((AQL));
而不是TO_BOOL(AQL)2)n.readed是一个JSON对象,FOR x IN是一个列表。在迭代n.readed的Attributes时,可以在这里使用ATTRIBUTES(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
PS: 如果您只是寻找属性的外观并且不想进行进一步过滤,那么使用HAS可以更容易:
FOR n IN Notifier
LET usersFound = HAS(n.readed, 'user_8')
FILTER usersFound==true
RETURN n
答案 1 :(得分:2)
如果您只是想要某个字段的存在哪个值可以转换为布尔值,您不需要打扰LET和子查询。以下查询使用HAS函数来确定文档和BOOL中指定字段的存在,以将其值转换为布尔表示:
LET search = 'user_8'
FOR n IN Notifier
FILTER HAS(n.readed, search) == true && TO_BOOL(n.readed[search])
RETURN n