сложный запрос couchbase с использованием метаданных и групп по - PullRequest
0 голосов
/ 15 марта 2019

Я новичок в 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 голосов
/ 15 марта 2019

Если у вас есть запрос 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 отлично подходит для одноразовых вопросов, но форум лучше для расширенного взаимодействия.

...