每个特定类型文档的N1QL查询计数

问题描述

我是新来的沙发和非关系型数据库

我有一个和球员和球队在一起的水桶(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给他们。