我是Couchbase的新手,并且对以下问题感到困惑。
此查询在Couchbase查询编辑器中工作正常:
SELECT
p.countryCode,
SUM(c.total) AS total
FROM bucket p
USE KEYS (
SELECT RAW "p::" || ca.token
FROM bucket ca USE INDEX (idx_cr)
WHERE ca._class = 'backend.db.p.ContactsDo'
AND ca.total IS NOT MISSING
AND ca.date IS NOT MISSING
AND ca.token IS NOT MISSING
AND ca.id = 288
ORDER BY ca.total DESC, ca.date ASC
LIMIT 20 OFFSET 0
)
LEFT OUTER JOIN bucket finished_contacts
ON KEYS ["finishedContacts::" || p.token]
GROUP BY p.countryCode ORDER BY total DESC
我明白了:
[
{
"countryCode": "en",
"total": 145
},
{
"countryCode": "at",
"total": 133
},
{
"countryCode": "de",
"total": 53
},
{
"countryCode": "fr",
"total": 6
}
]
现在,在春季启动应用程序中使用此查询时,我遇到以下错误:
无法检索到足够的元数据以进行N1QL到实体的映射,您是否已选择_ID和_CAS?
添加元数据,
SELECT
meta(p).id AS _ID,
meta(p).cas AS _CAS,
p.countryCode,
SUM(c.total) AS total
FROM bucket p
尝试将其映射到以下对象:
data class CountryIntermediateRankDo(
@Id
@Field
val id: String,
@Field
@NotNull
val countryCode: String,
@Field
@NotNull
val total: Long
)
结果:
由于以下n1ql错误而无法执行查询: {“ msg”:“表达式必须是组密钥或集合:(meta({
p
)。id
)”,“ code”:4210}
使用Map作为返回值会导致:
org.springframework.data.couchbase.core.CouchbaseQueryExecutionException:返回基本类型的查询应返回准确的1个结果,得到0
很明显,我在这里缺少有关如何编写适当的Couchbase查询的重要信息。我被困在需要元数据和获取与GROUP BY子句相关的键/聚合错误之间。非常感谢您的帮助。
答案 0 :(得分:0)
当您有GROUP BY查询时,SELECT子句中的所有内容都应该是用于分组的字段或组聚合。您需要将新字段添加到GROUP BY语句中,如下所示:
SELECT
_ID,
_CAS,
p.countryCode,
SUM(p.c.total) AS total
FROM testBucket p
USE KEYS ["foo", "bar"]
LEFT OUTER JOIN testBucket finished_contacts
ON KEYS ["finishedContacts::" || p.token]
GROUP BY p.countryCode, meta(p).id AS _ID, meta(p).cas AS _CAS
ORDER BY total DESC
(我必须对您的查询进行一些更改才能有效地使用它。您需要根据具体情况修改建议。)
如果您需要更详细的建议,请允许我提出N1QL论坛https://forums.couchbase.com/c/n1ql。 StackOverflow非常适合一个到一个问题,但是该论坛更适合扩展交互。