Как выделить список значений объекта в массив с N1QL - PullRequest
0 голосов
/ 23 марта 2019

У меня есть документы json в корзине Couchbase, которые выглядят так:

{
  "id":"10"
  "threadId": "thread1",
  "createdDate": 1553285245575,
}
{
  "id":"11"
  "threadId": "thread1",
  "createdDate": 1553285245776,
}
{
  "id":"12"
  "threadId": "thread2",
  "createdDate": 1553285245575,
}

Я пытаюсь создать запрос, который выбирает документы, основанные на группировке по threadId, и самый последний документ, созданный createDate.

Я написал такой запрос n1ql, но он возвращает только documentId, как это.

SELECT max([mes.createdDate,meta(mes).id])
from `messages`  as mes
group  by mes.threadId


result: 
    [
      {
        "$1": [
          1553285245776,
          "11"
        ]
      },
      {
        "$1": [
          1553285245737,
          "12"
        ]
      }
    ]

Но я хочу привести вот так

[{
  "id":"10"
  "threadId": "thread1",
  "createdDate": 1553285245575,
}
{
  "id":"11"
  "threadId": "thread1",
  "createdDate": 1553285245776,
}]

Буду признателен за любую помощь

1 Ответ

1 голос
/ 23 марта 2019
SELECT m.*
FROM `messages` AS mes
WHERE mes.threadId IS NOT NULL
GROUP BY mes.threadId
LETTING m = MAX([mes.createdDate, mes])[1];

Вы можете использовать следующий индекс и запрос, который использует покрытие избегает выборки.

CREATE INDEX ix1 ON `messages`(threadId, createdDate DESC, id);
SELECT m.*
FROM `messages` AS mes
WHERE mes.threadId IS NOT NULL
GROUP BY mes.threadId
LETTING m = MAX([mes.createdDate,{mes.threadId,mes.createdDate, mes.id}])[1];
...