问题描述
我是新来的沙发和非关系型数据库。
我有一个和球员和球队在一起的水桶(2种类型的文件)。 每个玩家的类型为playFor(包含他所参加的所有团队的数组)和名称,例如:
{
"type":"player"
"name":"player1"
"playedFor": [
"England/Manchester/United"
"England/Manchester/City"
]
}
每个团队都有类型,名称和类别,例如:
{
"type": "team"
"name": "England/Manchester/City"
"category": "FC"
}
我想知道FC类每支球队有多少名球员。 我通过查询此查询来计算特定团队:
SELECT COUNT(1) AS total
FROM bucket AS a
WHERE a.type='player'
AND (any r in a.playedFor satisfies r in ["England/Manchester/United"] end)
但是如何为所有团队进行此查询?
解决方法
您对数据进行建模的方式是,玩家可以参加1个或更多团队(因此可以排列)。
一种解决方法是使用Couchbase的UNNEST clause“展平”这些数组(基本上是将文档连接到数组中的每个项目)。
到那时,它变得像标准GROUP BY
一样容易。这是一个示例:
SELECT team,count(1) AS totalPlayers
FROM `bucket` AS a
UNNEST a.playedFor team
WHERE a.type='player'
GROUP BY team
此查询将生成如下输出:
[
{
"team": "Pittsburgh/Pirates","totalPlayers": 8
},{
"team": "England/Manchester/United","totalPlayers": 10
},{
"team": "England/Manchester/City","totalPlayers": 15
},{
"team": "Cincinnati/Reds","totalPlayers": 21
}
]
(抱歉,我对MLB球队的了解不多,因为我对足球队了解不多。)
请注意,单独的团队文档没有参与该查询,但是如果您需要查询他们的信息,也可以JOIN
给他们。