【问题标题】:Filter documents using n1ql使用 n1ql 过滤文档
【发布时间】:2017-05-15 07:46:34
【问题描述】:

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

文件类型(歌手):

{
  "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”。这两种可能吗?

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

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

    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 的投影中的“FIRST”N1QL 表达式中。这里,

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

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

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

    干杯!!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这个选择完美!它简单而雄辩。谢谢。
      【解决方案3】:

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

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

      【讨论】:

      • 但在这种情况下,我只获得creationDate 字段而不是整个文档。
      • 而且我不使用“歌手”类型,因为我实际上在“专辑”文档中拥有所有需要的数据。
      • 当然.. 我以为你也想要专辑名称,因此我选择了 creationDate (用于查找 MAX),并选择了 album.name 进行投影。请注意,排序比 MAX 更昂贵。 N1QL 功能强大、灵活且可兼容(如 SQL)。我们可以通过多种方式编写查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多