在我们的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秒才能得到响应。
是否有可能在此结构上创建适当的索引?或者任何可以加速查询的解决方案?
答案 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 ;