如何对 Couchbase 数组索引进行聚合查询?

How do I do an aggregate query against a Couchbase array index?

我的数据库中有包含“标志”数组的文档。其中每一个都有一个包含字符串的“标志”值。我正在尝试计算所有文档中每个标志字符串的数量。例如,如果我有两个文档:

{
  "flags": [
    {
      "flag": "flag1",
      ...
    },
    {
      "flag": "flag2",
      ...
    }
  ],
  ...
},
{
  "flags": [
    {
      "flag": "flag1",
      ...
    },
    {
      "flag": "flag3",
      ...
    }
  ],
  ...
}

我希望得到这样的结果:

{
  {
    "flag": "flag1",
    "flag_count": 2
  },
  {
    "flag": "flag2",
    "flag_count": 1
  },
  {
    "flag": "flag3",
    "flag_count": 1
  }
}

我创建了一个如下所示的索引:

CREATE INDEX `indexname` ON `dbname`((all (array (`f`.`flag`) for `f` in `flags` end)),`flags`) WHERE (`type` in ["type1", "type2"])

到目前为止,我能够让它工作的唯一方法是使用这样的查询:

SELECT f1.flag, count(*) as flag_count from dbname s unnest flags as f1 where (s.type in ["type1", "type2"]) AND any f in s.flags satisfies f.flag like '%' end group by f1.flag

这一切对我来说都很有意义,除了它需要一些类似于 AND any f in s.flags satisfies f.flag like '%' 部分到 运行 的东西——如果我把它排除在外,它会告诉我它找不到一个有效的索引。有没有办法构造它以便我可以将其排除在外?对我来说似乎没有必要,但我想我错过了一些东西。

CREATE INDEX ix1 ON dbname( ALL ARRAY f.flag FOR f IN flags END)
WHERE type IN ["type1", "type2"];

SELECT f.flag, COUNT(1) AS flag_count
FROM dbname AS d
UNNEST d.flags AS f
WHERE d.type IN ["type1", "type2"] AND f.flag LIKE "%"
GROUP BY f.flag;

如果 ARRAY 有重复的标志值并且每个文档计数一个

SELECT f.flag, COUNT( DISTINCT META(d).id) AS flag_count
FROM dbname AS d
UNNEST d.flags AS f
WHERE d.type IN ["type1", "type2"] AND f.flag LIKE "%"
GROUP BY f.flag;

检查 UNNEST https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/indexing-arrays.html