【问题标题】:Couchbase N1QL query with joined subquery with USE KEYSCouchbase N1QL 查询与使用 USE KEYS 连接的子查询
【发布时间】:2020-01-08 13:23:03
【问题描述】:

我需要编写一个 n1ql 查询,该查询需要在 select 子句中使用另一个子查询。因为在 n1ql 中编写子查询时必须使用“使用密钥”。如何为内部连接查询编写 USE KEYS 子句,下面是相同情况的示例:

select meta(m).id as _ID, meta(m).cas as _CAS, 
   (select c.description 
    from bucketName p join bucketName c on p.categoryId = c.categoryId and p.type='product' and 
    c.type='category' and p.masterId=m.masterId ) as description //--How to use USE KEYS here ?
from bucketName m where m.type='master' and m.caseId='12345'  

我的要求是从另外 2 个连接的表中获取一些值。但是,我简化了上述查询以使其更易于理解。

  • 请提出正确的实施方式。
  • 另外,正在写 n1ql 中的子查询比单独获取文档要好 在编码中合并它们?

【问题讨论】:

    标签: subquery couchbase n1ql


    【解决方案1】:

    非 FROM CLAUSE,相关子查询需要 USE KEYS,因为全局二级索引查询可能需要很长时间和资源。这是目前 N1QL 中的限制。如果您可以从 m 中导出 p 的文档密钥,则可以将其作为 p 中的 USE KEYS 给出。

    否则你有两个选择

    选项 1:由于您的子查询在投影中,因此使用 ANSI JOIN https://blog.couchbase.com/ansi-join-support-n1ql/

    SELECT META(m).id AS _ID, META(m).cas AS _CAS, c.description
    FROM bucketName AS m
    LEFT JOIN bucketName AS p ON p.masterId=m.masterId AND p.type='product'
    LEFT JOIN bucketName AS c ON c.type='category' AND p.categoryId = c.categoryId
    WHERE m.type='master' AND m.caseId='12345';
    
    CREATE INDEX ix1 ON (caseId) WHERE type='master';
    CREATE INDEX ix2 ON (masterId, categoryId) WHERE type='product';
    CREATE INDEX ix3 ON (categoryId, description) WHERE type='category';
    
    NOTE: If there is no Unique relation m to p to c JOIN can produce more results. 
    If that is case, you can do GROUP BY META(m).id, META(m).cas and 
    ARRAY_AGG(c.description). All descriptions are given as ARRAY.
    

    选项 2: 如您所述,在应用程序中发出两个单独的查询并合并。

    【讨论】:

    • 一般来说,最好的方法应该是什么。尝试使用查询合并 Coucbase 中的数据或在应用程序中合并它们?
    • 在查询中合并
    • 感谢您的回复。此外,在加入子句或 where 子句的每个属性上创建索引是否是强制性的/好的?或者在连接和 where 子句中使用属性而不在它们上创建索引甚至可以吗?
    • 同时使用两者来创建复合索引。试试index-advisor.couchbase.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多