2014-10-21 26 views
5

içinde kullanmak için LET değişkeni 'Notifier' koleksiyonum var.Arangodb AQL değişkenini FILTER

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 

aşağıdaki hatayı alıyorum:

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

Ben şu AQL ile bu belgeyi bulmak deneyin: Bu koleksiyonun Aşağıdaki örnek belgesini Verilen

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

Ben nasıl Bu AQL'i LET kullanarak doğru şekilde yazınız mı?

cevap

5

Sorunuz neredeyse doğru, 2 küçük sorun var.

1) TO_BOOL() karşılık gelen işlevi tetiklemek için kullanılan karakterlerdir, şimdi ek() içindeki bir AQL deyimini sarmalayarak tetiklenen bir alt sorgu eklemek istiyorsunuz. Yani TO_BOOL (AQL) yerine kullanmak zorundasınız: TO_BOOL ((AQL));

2) n.readed bir JSON nesnesidir, IN x IN bir liste bekler. N.readed'in Nitelikleri üzerinde yineleme yaparken, burada ATTRIBUTES (n.readed) kullanabilirsiniz. İşte

senin örneğin doğru çözümdür:

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 

Not: yalnızca bir özelliğin exisence arıyoruz ve biraz daha kolay kullanarak bu alabilirsiniz filtreleme ileri yapmak istemiyorsanız HAS:

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

sen sadece LET ve alt sorgular ile rahatsız gerekmez boolean değerine dönüştürülebilir değer bazı alanın varlığı arıyorsanız. Aşağıdaki sorgu, belgede belirtilen alanın varlığını ve BOOL değerini boole temsiline dönüştürmek için BOOL işlevini kullanır HAS işlevini kullanır:

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