使用对象结构的对象的慢速 n1ql 查询

Slow n1ql query using object of objects structure

在我们的 couchbase 数据库中,我们有一个包含相对较大对象的桶。这些对象内部还有其他对象,比方说人。这应该是一个数组,但是出于某种原因我们不得不将它创建为对象的对象,这就是它的样子:

{
    "companyName": "company name",
    "companyid": "11111-GUID-11111",
    "people": {
        "22222-GUID-22222": {
            "peopleid": "22222-GUID-22222",
            "name": "name1"
        },
        "33333-GUID-33333": {
            "peopleid": "33333-GUID-33333",
            "name": "name2"
        },
        "44444-GUID-44444": {
            "peopleid": "44444-GUID-44444",
            "name": "name3"
        }
    }
}

它还有结构相似的子对象。

我可以像这样对该文档进行查询:

SELECT c.*
FROM companies c
WHERE ANY v IN OBJECT_VALUES(c.people) SATISFIES v.peopleid = "22222-GUID-22222" END 
LIMIT 100 
OFFSET 40000;

我有一个存储桶,其中包含 50000 个这样的文档。

上面的查询运行完美,并给出了正确的响应,但我必须等待大约 25 秒才能得到响应。

是否有可能在此结构上创建适当的索引?或者任何可以加快查询速度的解决方案?

您可以尝试按照 https://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/indexing-arrays.html 所述创建数组索引。你提到大对象检查数组索引键大小限制。

CREATE index ia1 ON companies (DISTINCT ARRAY v.peopleid FOR v IN OBJECT_VALUES(people) END);

当您使用大偏移量时,您将丢弃大量文档。如果您使用的是 4.6.2+(因为它可以使用上面 link 中描述的隐式覆盖数组索引),您可以使用覆盖查询获取 LIMIT 文档的 META().id,并获取所需的文档,如下所示。

SELECT c.* FROM
    (SELECT RAW META(c).id FROM companies c
       WHERE ANY v IN OBJECT_VALUES(c.people) 
                  SATISFIES v.peopleid = "22222-GUID-22222" END 
       LIMIT 100 OFFSET 40000) AS q 
 JOIN companies c ON KEYS q ;