首页 文章

来自AQL的Arangodb LET变量在FILTER中使用它

提问于
浏览
5

我有'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声明,期待)位于3:10的'OR user IN n.readed FILT ...'附近

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

2 回答

  • 2

    您的查询几乎是正确的,有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
    
  • 5

    如果您只是想要某个字段的存在哪个值可以转换为布尔值,则无需使用LET和子查询 . 以下查询使用HAS函数来确定文档和BOOL中指定字段的存在,以将其值转换为布尔表示:

    LET search = 'user_8'
    FOR n IN Notifier
        FILTER HAS(n.readed, search) == true && TO_BOOL(n.readed[search])
        RETURN n
    

相关问题