使用n1ql过滤文档

时间:2017-05-15 07:46:34

标签: couchdb couchbase 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)。在我的情况下,我必须得到歌手“保罗”和专辑“惊人的夜晚”。这可能吗?

3 个答案:

答案 0 :(得分:2)

当然有可能..尝试此查询:

list == NULL

大多数魔法都在投影中的'FIRST'N1QL表达式中,用于计算latestAlbum。这里,

  • ARRAY_AGG({...})表达式使用createDate& amp;动态创建一个对象数组。每位歌手的专辑名称(来自GROUP BY)
  • FIRST表达式返回上述数组中与WHEN条件匹配的第一个这样的元素,具有MAX creationDate值。请注意,您使用的日期格式是词法排序顺序,因此我们不需要任何日期格式处理来排序日期值。
  • 歌手名称是通过LETTING class
  • 中的子查询获得的

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

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

干杯!!

答案 1 :(得分: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];

答案 2 :(得分: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. 使用SELECT函数在array_agg()语句中创建包含相册的数组;
  2. 使用ARRAY_SORT()按特定字段(album.creationDate)对此数组进行排序。此功能仅以ASC顺序排序。
  3. 使用ARRAY_REVERSE()撤消订单以获取最新专辑