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