首页 > 解决方案 > 每个特定类型文档的 N1QL 查询计数

问题描述

我是沙发库和非关系数据库的新手。

我有一个包含球员和球队的桶(2 种文件)。每个玩家都有类型,playedFor(一个包含他参加过的所有球队的数组)和一个名字,例如:

{
    "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)

但我怎样才能对所有团队进行此查询?

标签: sqlcouchbasen1ql

解决方案


您对这些数据建模的方式的问题是球员可以为 1 支或多支球队效力(因此是数组)。

解决此问题的一种方法是使用 Couchbase 的UNNEST 子句来“展平”这些数组(它基本上是将文档连接到数组中的每个项目)。

到那时,它变得像标准一样容易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如果您需要来自他们的信息以进行查询,您也可以使用它们。


推荐阅读