使用元数据和分组依据进行复杂的沙发床查询

时间:2019-03-15 11:47:08

标签: sql spring-boot group-by couchbase

我是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子句相关的键/聚合错误之间。非常感谢您的帮助。

1 个答案:

答案 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非常适合一个到一个问题,但是该论坛更适合扩展交互。