couchbase,为什么此查询返回零结果

时间:2018-12-26 19:36:34

标签: couchbase n1ql

我正在尝试使用此n1ql沙发式查询为给定客户选择最新创建的订单:

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 :(得分:2)

通过在“ raw”中添加“ in”(因为结果是列表)(为了得到字面值),我解决了这个问题:

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

答案 1 :(得分:2)

如果不给出RAW子查询结果,则结果将成为与值不匹配的对象数组。通过RAW,它变成了值的数组。

您似乎想要具有最大creationDateTime的文档。试试这个。

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

MAX参数为2个元素的ARRY。第一个是creationDateTime,第二个是整个文档。它尝试最大化ARRAY的值,即第一个值,如果有平局,则第二个值。最终,它投影出第二个值,即整个文档。

这避免了两次扫描整个订单。

如果您想要更有效的查询。

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;