2014-10-21 14 views
5

Mam kolekcję "Notifier". Biorąc pod uwagę następujący przykład dokument tej kolekcji:Zmienna Arangodb LET z AQL do użycia w FILTERU

{ 
    "timestamp": 1413543986, 
    "message": "message", 
    "readed": { 
    "user_8": 0, 
    "user_9": 0, 
    "user_22": 0 
    }, 
    "type": "1014574149174" 
} 

próbuję znaleźć ten dokument z poniższej 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 

pojawia się następujący błąd:

[1501] syntax error, unexpected FOR declaration, expecting) near 'OR user IN n.readed FILT...' at position 3:10

Jak mogę poprawnie napisać to AQL używając LET?

Odpowiedz

5

Twoje zapytanie jest prawie poprawne, są 2 drobne problemy.

1) TO_BOOL() to znaki uruchamiające funkcję correspoding, teraz chcesz wstawić podzapytanie, które jest wyzwalane przez zawijanie instrukcji AQL w dodatkowym(). Zamiast więc TO_BOOL (AQL) musisz użyć: TO_BOOL ((AQL));

2) n.readed jest obiektem JSON, FOR x IN oczekuje listy. Podczas iteracji nad atrybutami n.readed możesz użyć ATTRIBUTES (n.readed) tutaj.

Oto poprawne rozwiązanie dla przykładu:

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: Jeśli tylko szukasz exisence atrybutu i nie chcą robić dalej filtrowania można dostać nieco łatwiejsze przy użyciu HAS:

FOR n IN Notifier 
LET usersFound = HAS(n.readed, 'user_8') 
FILTER usersFound==true 
RETURN n 
2

Jeśli tylko szukasz obecności jakiejś dziedzinie, której wartość może być przekształcany do wartości logicznej nie trzeba męczyć się z Pozwolić i podzapytania. Następująca kwerenda używa funkcji HAS do określenia obecności określonego pola wewnątrz dokumentu i BOOL, aby przekonwertować jego wartość na reprezentację boolowską:

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