nasıl

2016-04-12 9 views
1

ı bir koleksiyon gibi "repo" içeren nesneler adında var varsayalım bu bir:nasıl

Şimdi
{ 
    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 .... 
    ] 
} 

bir sorgu böyle bir şey içine bu nesnelerin her biri dönüştürmek istediğiniz :

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

aşağıdaki gibi bir şey düşündüm:

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 
    } 

ama korkarım tha değilim çifte IÇİ çok verimli olmayabilir.

Herhangi bir öneriniz var mı?

cevap

2

Sen array expansion operator kullanarak daha kompakt formda Sorgunuzla ifade edebilir: (sizin sonucu kayıt başına sadece bir kez her değişiklik türünü olsun

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

Ayrıca etmek UNIQUE kullanabilir eğer diziler changes ve timestamps don sorgu yalnızca iki alt sorgu yükü ekler genel olarak

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

ve yukarıda daha o kadar yavaş olmamalı: 't) sanatçısını var. Ancak, daha kompakt ve bu yüzden okumak için biraz daha iyi, değil mi?