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

Node.js 使用对象的对象结构的慢速n1ql查询,node.js,couchbase,n1ql,Node.js,Couchbase,N1ql,在couchbase数据库中,我们有一个包含相对较大对象的bucket。这些物体里面还有其他物体,比如说人。这应该是一个数组,但是出于某种原因,我们不得不将其创建为对象的对象,它看起来是这样的: { "companyName": "company name", "companyid": "11111-GUID-11111", "people": { "22222-GUID-22222": { "peopleid": "22222-G

在couchbase数据库中,我们有一个包含相对较大对象的bucket。这些物体里面还有其他物体,比如说人。这应该是一个数组,但是出于某种原因,我们不得不将其创建为对象的对象,它看起来是这样的:

{
    "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秒的响应


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

您可以尝试按所述创建数组索引。您提到了大型对象,请检查数组索引键大小限制

在不同的公司数组v.peopleid上创建索引ia1,用于对象\u值ople END中的v

当您使用大偏移量时,您将丢弃大量文档。如果您使用的是4.6.2+,因为它可以使用上面链接中描述的隐式covered数组索引,那么您可以使用covered query获取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 ;

您可以创建另一个索引,并在该索引上进行查询,在对象_VALUESpets END中的v的不同数组v.petid上创建索引ia2;请检查示例4:为嵌套数组C4的各个元素编制索引,Q4因为OBJECT_值生成数组并遵循类似的顺序,所以您是否尝试过两个任意子句,一个用于peopleid,另一个带有两个索引的petid用于companyid,您可以在Companys DISTINCT数组v上创建复合索引,如create index ia1。OBJECT_值中的v的peopleid用于companyid;然后放下ia3。这很棘手,因为你有两个关于满足和索引的条件,用户coverindex没有这两个信息,最好的方法是保留ia1并从公司c中选择c*,其中任何v IN OBJECT_values c.people满足任何宠物IN OBJECT_VALUESv.pets满足pet.petid=1111111111-111111-pet END和v.peopleid=1111111111-111111-people END和c.companyid!=000045001公司限额30抵销40000;也试试这个。在companys DISTINCT ARRAY[v.peopleid,p.petid]上为OBJECT\u VALUESv.pets END中的p创建索引ia4,为OBJECT\u values中的v创建索引people END,companyid;选择c.*从公司c中选择原始元id,其中任何v IN OBJECT_VALUESc.people满足任何p IN OBJECT_VALUESv.pets满足[v.peopleid,p.petid]=[1111111111-111111-people,1111111111-111111-pet]END和c.companyid!=000045001公司限额30抵消40000,因为q键加入公司r;