使用 n1ql 过滤文档

Filter documents using n1ql

我有两种具有一对多关系的文档,我只需要根据最新的日期值获取一个文档。这是一个例子:

文件类型(歌手):

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

文档类型(专辑 1):

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

文档类型(专辑 2):

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

好吧,我需要获得只有一张专辑的歌手列表(这是最后添加的,基于 creationDate)。就我而言,我必须获得歌手 "Paul" 和专辑 "Amazing night"。这有可能吗?

当然有可能。试试这个查询:

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];

大部分魔法都在 'FIRST' 计算最新专辑的投影中的 N1QL 表达式中。这里,

  • ARRAY_AGG({...}) 表达式为每个歌手(来自 GROUP BY)动态创建一个包含 createDate 和专辑名称的对象数组
  • FIRST 表达式returns 上述数组中第一个与 WHEN 条件匹配的此类元素,具有 MAX creationDate 值。请注意,您使用的日期格式是按词汇排序顺序排列的,因此我们不需要任何日期格式处理来对日期值进行排序。
  • 歌手名是通过LETTING中的子查询得到的class

顺便说一句,如果你想获得具有相同创作日期的所有最新专辑,你可以使用 ARRAY 构造(而不是 FIRST)

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

干杯!!

我还想出了一个获取最新专辑的选项:

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()倒序获取最新专辑

如果您需要相册文档,请使用以下查询。

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];