使用对象结构对象减慢n1ql查询

时间:2017-10-12 14:17:07

标签: node.js couchbase n1ql

在我们的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秒才能得到响应。

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

1 个答案:

答案 0 :(得分:1)

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

创建索引ia1 ON公司(DISTINCT ARRAY v.peopleid for v in OBJECT_VALUES(people)END);

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

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 ;