2016-04-12 4 views
1

Nehmen wir an, ich habe eine Sammlung ein „repos“ enthält Objekte wie folgt benannt:, wie Objekte in Arrays in einer Abfrage zur Karte

{ 
    name: 'myrepo', 
    actions: [ 
    { timestamp: '2016-04-12T14:43:20Z', change: 'add' }, 
    { timestamp: '2016-04-12T14:45:10Z', change: 'remove' }, 
    { timestamp: '2016-04-12T15:03:03Z', change: 'add' }, 
    ... and so on .... 
    ] 
} 

Jetzt möchte ich eine Abfrage wie folgt jedes dieser Objekte in etwas umwandeln :

{ 
    name: 'myrepo', 
    timestamps: ['2016-04-12T14:43:20Z', '2016-04-12T14:45:10Z', '2016-04-12T15:03:03Z'], 
    changes: ['add', 'remove', 'add'] 
} 

ich habe wie die folgende etwas einfiel:

FOR r in repos 
LET changes= (FOR a IN r.actions RETURN a.change) 
LET timestamps = (FOR a IN r.actions RETURN a.timestamp) 
RETURN { 
    name: r.name, 
    changes: changes, 
    timestamps: timestamps 
    } 

aber ich fürchte, tha t das doppelte FOR kann nicht sehr effizient sein.

Irgendwelche Vorschläge?

Antwort

2

Sie können Ihre Abfrage in einer kompakteren Form ausdrücken mit der array expansion operator:

FOR r IN repos RETURN { 
    name: r.name, 
    changes: r.actions[*].change, 
    timestamps: r.actions[*].timestamp 
} 

Sie auch in Ihrem Ergebnis UNIQUE nur einmal jede Änderung Typ (wenn die Felder pro Datensatz verwenden changes und timestamps don ‚t zu Lineup):

FOR r IN repos RETURN { 
    name: r.name, 
    changes: UNIQUE(r.actions[*].change), 
    timestamps: r.actions[*].timestamp 
} 

im allgemeinen Ihre Abfrage nur den Aufwand für die zwei Unterabfragen erstellt und soll nicht sein, dass viel langsamer als die oben. Allerdings ist es kompakter und daher ein bisschen besser zu lesen, oder?