如何编写一个 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 BY
和 COUNT
组合可以成为您的解决方案吗?
SELECT COUNT(x) FROM bucket WHERE district = 'Maboro' GROUP BY type
使用不带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);
我是 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 BY
和 COUNT
组合可以成为您的解决方案吗?
SELECT COUNT(x) FROM bucket WHERE district = 'Maboro' GROUP BY type
使用不带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);