2017-11-20 15 views
4

ArangoDB AQLクエリのヘルプが必要です。親テーブル(Event)に更新の詳細を記録するトランザクション詳細コレクション(EventTran)があります。 EventTranの属性は、timestamp、および親の参照番号_id_eventを含みます。私はの最初と最後の(timestampEventTranの文書id_eventの配列を返すためにクエリを実行しようとしています。ここでは例です:ArangoDB AQLクエリの最初と最後のエントリを取得する方法

FOR event IN EventTran 
    FILTER event._id_event == "Event/167697" 
    SORT event.timestamp DESC 
    RETURN event 

が返されることがあります:

[ 
    { 
    "_key": "214092", 
    "_id": "EventTran/214092", 
    "_id_event": "Event/167697", 
    "timestamp": 1511202637 
    }, 
    { 
    "_key": "213958", 
    "_id": "EventTran/213958", 
    "_id_event": "Event/167697", 
    "timestamp": 1511202542 
    }, 
    { 
    "_key": "191809", 
    "_id": "EventTran/191809", 
    "_id_event": "Event/167697", 
    "timestamp": 1511118705 
    }, 
    { 
    "_key": "167701", 
    "_id": "EventTran/167701", 
    "_id_event": "Event/167697", 
    "timestamp": 1510965562 
    } 
] 

私は非常に最初のログエントリすなわち、のみ最初最後のアイテムを持つ配列を返しますクエリをしたいです最新のログエントリ:

[ 
    { 
    "_key": "214092", 
    "_id": "EventTran/214092", 
    "_id_event": "Event/167697", 
    "timestamp": 1511202637 
    }, 
    { 
    "_key": "167701", 
    "_id": "EventTran/167701", 
    "_id_event": "Event/167697", 
    "timestamp": 1510965562 
    } 
] 

答えて

2

2つのp ossibleソリューション:あなたが見ることができるように、1つのクエリはソート順DESCと他の使用している

RETURN [ 
    (FOR event IN EventTran 
    FILTER event._id_event == "Event/167697" 
    SORT event.timestamp DESC 
    LIMIT 1 
    RETURN event 
)[0], 
    (FOR event IN EventTran 
    FILTER event._id_event == "Event/167697" 
    SORT event.timestamp ASC 
    LIMIT 1 
    RETURN event 
)[0] 
] 

1)最初のものは2つのクエリを実行し、それぞれからわずかトップ/ボトム文書を返すことですソート順はASCです。それぞれのクエリから1つのドキュメントだけが返され、クエリごとにそのドキュメントのみが返されます。 指定した_id_eventの値に一致する文書がない場合、クエリはそれぞれnullを返します。したがって、全体の結果は[null, null]になります。

2)代替がすべてを行うことですが、単一のクエリで、それからだけで最初と最後の文書を返します。

LET results = (
    FOR event IN EventTran 
    FILTER event._id_event == "Event/167697" 
    SORT event.timestamp ASC 
    RETURN event 
) 
RETURN [ 
    results[0], 
    results[-1] 
] 

しかし、これは、関連するイベントのすべての文書は、(多くのかもしれだろう)? 2つのクエリのソリューションがより効率的になる可能性があります。

+0

助けてくれてありがとう!間違いなくトランスの数が多いので、最初のソリューションが最高に聞こえます。 –

4

の状況では、次のことは間違いなく最良の解決策ではありませんが、コレクションが非常に小さい場合は、おそらく最後のもの であるSORTは避けてください。

アイデアは非常に簡単です:最小値と最大値を決定し、最小値のアイテムを収集してそれらの1つを選択し、同様に最大アイテムを選択します。

LET mnmx = (
    FOR x in EventTran 
    FILTER event._id_event == "Event/167697" 
    COLLECT AGGREGATE mn = MIN(x.timestamp), mx = MAX(x.timestamp) 
    RETURN {mn,mx}) 

LET mn = mnmx.mn 
LET mx = mnmx.mx 

LET least = (
    FOR x in EventTran 
    FILTER x.timestamp == mn 
    COLLECT y=x INTO minimal 
    RETURN minimal[0]) 

LET greatest = (
    FOR x in EventTran 
    FILTER x.timestamp == mx 
    COLLECT y=x INTO maximal 
    RETURN maximal[0]) 

RETURN {least, greatest} 

最後の行は、の略語である{「少なくとも」:少なくとも、「最大」:最大}、leastgreatestが最小と最大のタイムスタンプを有する項目です。

+1

このクエリでは、@ stjで示される最初のクエリの '_id_event、timestamp'にskiplistインデックスを利用することはできませんが、' COLLECT AGGREGATE'で何ができるのか興味深いデモンストレーションです。 – CoDEmanX

関連する問題