【问题标题】:How to write one n1ql query to sum values from multiple documents in the same bucket如何编写一个 n1ql 查询来对同一存储桶中多个文档的值求和
【发布时间】:2019-07-24 14:00:41
【问题描述】:

我是 Couchbase DB 服务器的新手,我试图通过一个查询来实现我对三个查询所做的事情,因为这不是那么有效。

我在同一个存储桶中有三种不同的文档类型(x,y,z);都有一个相似的键:'district' 像这样:

文档 x:

{
  "type": "x",
  "district": "Some district"
}

文档y:

{
  "type": "y",
  "district": "Some district"
}

文档z:

{
  "type": "z",
  "district": "Some district"
}

我目前在 PHP 中实现了类似以下的伪代码:

$totalDistrictInX = "SELECT COUNT(x) FROM bucket WHERE type = 'x' AND district = 'Maboro';

$totalDistrictInY = "SELECT COUNT(x) FROM bucket WHERE type = 'y' AND district = 'Maboro';

$totalDistrictInZ = "SELECT COUNT(x) FROM bucket WHERE type = 'z' AND district = 'Maboro';

$totalCountOfMaboro = $totalDistrictInX + $totalDistrictInY + $totalDistrictInZ;

我无法使用 JOIN 查询,因为当前使用的 Couchbase 服务器低于 5.50 which only supports joining documents between document key to document field and not between document fields

有没有办法通过一个 n1ql 查询来实现这一点?任何帮助将不胜感激。

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

    使用聚合查询,不使用 group by 进行总计数,通过谓词控制要计数的文档。

    SELECT COUNT(1) AS cnt
    FROM bucket
    WHERE type IN ['x', 'y', 'z'] AND district = 'Maboro';
    

    如果您需要每种类型的计数,请使用 GROUP BY

    SELECT type, COUNT(1) AS cnt
    FROM bucket
    WHERE type IN ['x', 'y', 'z'] AND district = 'Maboro'
    GROUP BY type;
    

    如果你想要总计数和单个类型,它的计数是数组

    SELECT ARRAY_SUM(av[*].cnt) AS totalcnt, av AS details
    LET av = (SELECT type, COUNT(1) AS cnt
              FROM bucket
              WHERE type IN ['x', 'y', 'z'] AND district = 'Maboro'
              GROUP BY type);
    

    【讨论】:

      【解决方案2】:

      GROUP BYCOUNT 组合可以成为您的解决方案吗?

      SELECT COUNT(x) FROM bucket WHERE district = 'Maboro' GROUP BY type
      

      Documentation

      【讨论】:

      • 感谢您的努力,但这没有用。 @vsr 的回答。
      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多