couchbase, почему этот запрос возвращает нулевой результат - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь выбрать последний созданный заказ для данного клиента, используя этот запрос n1ql couchbase:

select O1.* 
from `order` as O1 where
O1.creationDateTime = (select max(O2.creationDateTime)  from `order` O2 )

Я не получаю результата, даже если:

select max(O2.creationDateTime) from заказ O2

вернуть этот результат:

[
  {
    "$1": 1545569597891
  }
]

спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Если вы не дадите результаты подзапроса RAW, вы получите массив объектов, которые не могут соответствовать значению.При использовании RAW он становится массивом значений.

Похоже, что вы хотите Document, который имеет максимальное creationDateTime.Попробуйте это.

SELECT RAW MAX([o1.creationDateTime, o1])[1]
FROM `order` AS o1
WHERE o1.creationDateTime IS NOT NULL;

Максимальный аргумент - ARRY из 2 элементов.1-й - creationDateTime, 2-й - весь документ.Он пытается MAX значение ARRAY, т. Е. 1-е значение, если есть связи, то второе значение.В конце концов он проецирует 2-е значение, т.е. весь документ.

Это позволяет избежать сканирования всего заказа дважды.

Если вы хотите более эффективный запрос.

Use Index Order.

CREATE INDEX ix1 ON `order`(creationDateTime DESC);

SELECT RAW o1
FROM `order` AS o1
WHERE o1.creationDateTime IS NOT NULL
ORDER BY o1.creationDateTime DESC LIMIT 1;

OR

Use Covered query decide which document key qualifies and then Fetch that document only.

SELECT o.* FROM (
     SELECT RAW MAX([o1.creationDateTime, META(o1).id])[1]
     FROM `order` AS o1
     WHERE o1.creationDateTime IS NOT NULL) AS o1 
JOIN `order` AS o  ON KEYS o1;
0 голосов
/ 26 декабря 2018

Добавив 'in' (потому что результатом является список) с 'raw' (чтобы получить только буквальное значение), я решил его:

select O1.* 
from `order` as O1 where
O1.creationDateTime in (select RAW max(O2.creationDateTime) as creationDateTime  from `order` O2 )
...