5

我收集了“通知程序”。鉴于此集合的以下示例文档:

{
  "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 声明,期望 ) 在位置 3:10 的“OR user IN n.readed FILT...”附近

如何使用 LET 正确编写此 AQL?

4

2 回答 2

5

您的查询几乎是正确的,有 2 个小问题。

1) TO_BOOL() 是触发对应函数的字符,您现在要插入一个子查询,该子查询是通过将 AQL 语句包装在附加 () 中来触发的。因此,您必须使用 TO_BOOL((AQL)); 而不是 TO_BOOL(AQL);

2) n.readed 是一个 JSON 对象,FOR x IN 需要一个列表。当您迭代 n.readed 的属性时,您可以在此处使用 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
于 2014-10-21T14:37:47.357 回答
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
于 2014-10-21T14:44:15.203 回答