【问题标题】:couchbase, Why this query return zero resultcouchbase,为什么这个查询返回零结果
【发布时间】:2018-12-26 19:36:34
【问题描述】:

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

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

即使这样我也没有得到任何结果:

select max(O2.creationDateTime) fromorderO2

返回这个结果:

[
  {
    "$1": 1545569597891
  }
]

感谢您的帮助

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

    通过添加 'in'(因为结果是一个列表)和 'raw'(为了只获得字面值)我解决了它:

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

    【讨论】:

      【解决方案2】:

      如果你不给 RAW 子查询结果,就会变成 Array of Objects,它不能与值匹配。通过 RAW,它变成了值数组。

      看起来您想要具有最大创建日期时间的文档。试试这个。

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

      MAX 参数是 2 个元素的 ARRY。第一个是创建日期时间,第二个是整个文档。它尝试最大化 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多