【问题标题】:How do I most optimally do this N1QL SELECT query?我如何以最佳方式执行此 N1QL SELECT 查询?
【发布时间】:2021-06-22 23:17:56
【问题描述】:

假设我有一堆 CONTACT 类型的文档:

{
    "contactId": "V1234",
    "contactFirstName": "A",
    "contactLastName": "N",
    "emailAddress": "12345",
    "invitationId": "IVT:123",
    "documentType": "CONTACT"
}

每个联系文件都有一个 EMAIL 文件和一个 INVITATION 文件:

EML:12345
{
    "emailId": "12345",
    "emailAddress" = ["abc@gmail.com"]
}
IVT:123
{
    "invitationId": "IVT:123",
    "invitationStatus": ["REGISTERED"]
}

假设我有一个 contactIds 数组:["V1234", "V2345" ... ]

如何为该列表中的每个contactId编写SELECT查询并选择contactFirstNamecontactLastNameeml.emailAddress.[0]invitation.status.[0](仅当状态为"REGISTERED"或@987654330类型时@.) 并将其限制为 10 个值。

我在想这样的事情:

SELECT DISTINCT
    contact.contactFirstName as `contactFirstName`, 
    contact.contactLastName  as `contactLastName`,
    eml.emailAddress         as `emailAddress`,
    ivt.status[0].status     AS  invitationStatus
from
    `contact-services` AS contact
    
    INNER JOIN `contact-services` AS eml ON
        CONCAT("EML",':',contact.contactEmailAddressIds[0]) =meta(eml).id 
    
    INNER JOIN `contact-services` AS ivt ON
        contact.invitationId =meta(ivt).id
WHERE
    contact.documentType="PERSON_CONTACT" 
    AND
    ivt.status[0].status IN ["INVITED", "REGISTERED"]
    and
    contact.contactId IN ["V8459243"]

【问题讨论】:

  • 除了限制为 10 之外,您的查询对我来说看起来不错。请注意,如果不指定排序顺序,您将无法有意义地限制您的结果 - 那么究竟应该如何确定“前”10 条记录?

标签: couchbase n1ql


【解决方案1】:
CREATE INDEX ix1 ON `contact-services` (contactId, emailAddress, invitationId, contactFirstName, contactLastName)
WHERE documentType = "CONTACT";

SELECT c.contactFirstName,
       c.contactLastName,
       (SELECT RAW e.emailAddress[0]
        FROM contact-services` AS e USE KEYS ("EML:"||c.emailAddress))[0] AS emailAddress,
       invt AS invitationStatus
FROM `contact-services` AS c
LET invt = (SELECT RAW i.invitationStatus
            FROM `contact-services` AS i USE KEYS c.invitationId
            WHERE ANY v IN i.invitationStatus SATISFIES v IN ["INVITED", "REGISTERED"] END)[0]
WHERE c.documentType = "CONTACT"
      AND c.contactId IN ["V8459243"] AND
      invt IS NOT MISSING
LIMIT 10;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2016-06-06
    相关资源
    最近更新 更多