2014-10-21 7 views
5

Ho la raccolta 'Notifier'. Dato il seguente documento esempio di questa collezione:Arangodb LET variabile da AQL per l'uso in FILTRO

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

cerco trovare questo documento con il seguente 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 

ottengo il seguente errore:

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

Come posso scrivere questo AQL correttamente usando LET?

risposta

5

La tua richiesta è quasi corretta, ci sono 2 problemi minori.

1) TO_BOOL() sono caratteri per attivare la funzione Correspoding, ora si desidera inserire una sottoquery, che viene attivata dal wrapping di un'istruzione AQL in additional(). Quindi invece di TO_BOOL (AQL) devi usare: TO_BOOL ((AQL));

2) n.readed è un oggetto JSON, PER x IN prevede una lista. Mentre stai iterando sugli attributi di n.readed puoi usare ATTRIBUTI (n.readed) qui.

Ecco la soluzione corretta per il tuo esempio:

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: Se sei solo alla ricerca per l'exisence di un attributo e non si vuole fare un ulteriore filtraggio è possibile ottenere che un po 'più facile utilizzando HA:

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

Se siete solo in cerca di una presenza di qualche campo, che valore può essere convertito in valore booleano che non è necessario preoccuparsi di LET e subquery. La query seguente utilizza la funzione HAS per determinare la presenza del campo specificato all'interno del documento e BOOL per convertire il valore in rappresentazione booleana:

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