如何编写一个 n1ql 查询来对同一存储桶中多个文档的值求和

How to write one n1ql query to sum values from multiple documents in the same bucket

我是 Couchbase 数据库服务器的新手,我试图用一个查询来实现我用三个查询所做的事情,因为这效率不高。

我在同一个存储桶中有三种不同的文档类型 (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 查询来实现这一点?如有任何帮助,我们将不胜感激。

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

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

Documentation

使用不带group by的聚合查询来统计总数,通过predicate控制统计哪些文档。

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