2017-05-15 89 views
0

我有兩種類型的文檔,其關係一對多,我只需要基於最新的日期值獲取一個文檔。這是一個例子:使用n1ql過濾文檔

文件類型(歌手):

{ 
    "id":"223-34fd-35325-dsf-343f", 
    "resourceType":"Singer", 
    "name":"Paul" 
} 

文件類型(Album1):

{ 
    "id":"456-d435-43g346-43-436tf-345g", 
    "name":"Amazing night", 
    "author":"223-34fd-35325-dsf-343f", 
    "creationDate": "2017-05-12T07:57:51.458Z" 
} 

文件類型(Album2):

{ 
    "id":"878-ffe6-43gs56-5hn7-ffgdd-345hd", 
    "name":"Be quiet", 
    "author":"223-34fd-35325-dsf-343f", 
    "creationDate": "2017-05-11T13:43:05.580Z" 
} 

好,我只需要獲得一張只有一張專輯的歌手名單(這是最後加入的,基於creationDate)。在我的情況下,我必須得到歌手「保羅」和專輯「驚人的夜晚」。這可能嗎?

回答

1

如果您需要相冊文檔中使用下面的查詢。

SELECT singer, MAX([a.creationDate, a])[1] latestAlbum 
FROM default a 
WHERE a.author IS NOT MISSING 
GROUP by a.author 
LETTING singer = (SELECT RAW s.name FROM default s USE KEYS a.author)[0]; 
+0

這個選擇作品完美!它簡單而雄辯。謝謝。 –

1

Ofcourse有可能..嘗試此查詢:

SELECT singer, 
     FIRST x.name FOR x IN ARRAY_AGG({a.creationDate, a.name}) 
        WHEN x.creationDate = max(a.creationDate) END 
     AS latestAlbum 
FROM default a 
WHERE a.author IS NOT MISSING 
GROUP by a.author 
LETTING singer = (SELECT RAW s.name FROM default s USE KEYS a.author)[0]; 

最神奇的是在計算latestAlbum投影「第一」 N1QL表達。這裏,

  • 的ARRAY_AGG({...})的表達動態創建的對象與CREATEDATE &專輯名稱爲每個歌手的陣列(從GROUP BY)
  • 第一表達式返回在第一個這樣的元件以上數組與WHEN條件匹配,並帶有MAX creationDate值。請注意,您使用的日期格式是詞法排序順序,所以我們不需要任何日期格式處理來排序日期值。
  • 歌手名稱與在出租類的子查詢獲得

順便說一句,你可以使用數組結構(而不​​是第一),如果你想用同一creationDate獲得所有最新專輯

ARRAY x.name FOR x IN ARRAY_AGG({a.creationDate, a.name}) 
       WHEN x.creationDate = max(a.creationDate) END 
    AS latestAlbum 

乾杯!

0

我也想通了一個選項,以獲得最新的專輯:

SELECT singer.name as singertName, ARRAY_REVERSE(ARRAY_SORT(array_agg(album.creationDate)))[0] as album from bucket where type='album' and album.author = "223-34fd-35325-dsf-343f" group by album.author order by album.author

  1. 使用array_agg()功能讓用在SELECT聲明相冊陣列;
  2. 使用ARRAY_SORT()按特定字段對此數組進行排序(album.creationDate)。此功能僅在ASC訂單中排序。
  3. 使用ARRAY_REVERSE()扭轉以獲得最新專輯
+0

但在這種情況下,我只獲得'''''''creationDate'''字段而不是整個文檔。 –

+0

而且我不使用「歌手」類型,因爲我實際上擁有「相冊」文檔中所有需要的數據。 –

+1

當然..我以爲你也想要專輯名稱,因此我選擇了creationDate(用於查找MAX)和album.name用於投影。請注意,排序比MAX更昂貴。 N1QL功能強大,靈活且可比較(如SQL)。我們可以用很多方式編寫查詢。 –