如何对 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
我的数据库中有包含“标志”数组的文档。其中每一个都有一个包含字符串的“标志”值。我正在尝试计算所有文档中每个标志字符串的数量。例如,如果我有两个文档:
{
"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