2016-10-26 4 views
1

Ich verwende ArangoDB 2.8ArangoDB: Filter in Sammlungen Art in einer Traversal Abfrage

ich eine Traversal Abfrage mache, die zwei verschiedene Sammlungen umfasst. In meinem Ergebnis möchte ich jedoch nur eine bestimmte Sammlung erhalten, sehe aber keine Möglichkeit, nach Sammlungsnamen zu filtern. In meinem Fall habe ich address Sammlung und user Sammlung. In address Sammlung unterscheide ich 3 Ebenen als: {addressType: state}, {addressType: city} und {addressType: street}. Dann habe ich eine Kante, die von address zu user Sammlung (Staat> Stadt> Straße> Benutzer) verbindet. Ich möchte eine Traversierung (wie im folgenden Code) von einem address (beliebigen Typs) zum user (falls vorhanden) durchführen und nur die Sammlung vom Typ user zurückgeben, zum Beispiel wenn eine Straße keine Verbindung zu einem Benutzer hat dann kehren Sie leer zurück.

For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false}) 
    RETURN p.vertex._id) 

Antwort

1

Eine andere Antwort ist mit der IS_SAME_COLLECTION Funktion wie this SO answer angedeutet:

FOR p IN TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false}) 
    FILTER IS_SAME_COLLECTION('user', p.vertex._id) 
    RETURN p.vertex._id) 

oder, da TRAVERSAL wurde in ArangoDB entfernt 3.0+ (see this answer und die migration guide), so etwas wie

FOR v IN 0..5 IN OUTBOUND @vertex_id myEdge 
    FILTER IS_SAME_COLLECTION('user', v._id) 
    RETURN v._id) 
1

Nun hatte ich eine Lösung zu finden, die hier so ist mir (ich weiß, ist nicht die beste, aber für mich gearbeitet):

Was ich tue, aufgespalten wird die _id von "/" und prüfen, ob die erste Teil (Sammlung Name) ist in ['user']

For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false}) 
    FILTER (SPLIT(p.vertex._id, "/", 1)[0]) IN ['user'] 
    RETURN p.vertex._id)