我如何以最佳方式执行此 N1QL SELECT 查询?
How do I most optimally do this N1QL SELECT query?
假设我有一堆 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"]
}
假设我有一个 contactId 数组:["V1234", "V2345" ...]
我将如何为该列表中的每个 contactId 和 select contactFirstName
、contactLastName
、eml.emailAddress.[0]
、[=19= 编写一个 SELECT
查询](仅当状态为 "REGISTERED"
或 "INVITED"
类型时)并将其限制为 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"]
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;
假设我有一堆 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"]
}
假设我有一个 contactId 数组:["V1234", "V2345" ...]
我将如何为该列表中的每个 contactId 和 select contactFirstName
、contactLastName
、eml.emailAddress.[0]
、[=19= 编写一个 SELECT
查询](仅当状态为 "REGISTERED"
或 "INVITED"
类型时)并将其限制为 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"]
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;