CouchBase Index嵌套元素

时间:2016-06-23 22:09:00

标签: database indexing couchbase n1ql nosql

在CouchBase(4.1.1)中,N1QL可以使用整个元素创建索引,并采用这两个示例。

说我们有这个文件结构:

{
   "name": "blah",
   "credentials": [
       {
          "level": 5,
          "sector": "XP"
       }
   ],
}

现在说我们想根据名称创建index1,整个凭证元素是可能的吗?

类似

create index indexName on `bucketName` (name, credentials) USING GSI;

或index2基于名称和其中一个嵌套字段,如level;怎么可以这样做?

之类的东西
create index indexName on `bucketName`(name, credential.levels) USING GSI; 

运行时解释我的二级索引未被使用,并且couchbase默认为此存储桶的主索引。

这是我正在使用的选择。

select s.name, s.credentials 
from `security` unnest s.credentials
where credentials is not missing and name = 'tom';

以下是制作的解释:

{
    "requestID": "f8d46eeb-3898-4ace-a24f-1582e0504eb7",
    "signature": "json",
    "results": [
        {
            "#operator": "Sequence",
            "~children": [
                {
                    "#operator": "PrimaryScan",
                    "index": "#primary",
                    "keyspace": "read",
                    "namespace": "default",
                    "using": "gsi"
                },
                {
                    "#operator": "Parallel",
                    "~child": {
                        "#operator": "Sequence",
                        "~children": [
                            {
                                "#operator": "Fetch",
                                "as": "s",
                                "keyspace": "bucketName",
                                "namespace": "default"
                            },
                            {
                                "#operator": "Unnest",
                                "as": "beacons",
                                "expr": "(`s`.`credentials`)"
                            },
                            {
                                "#operator": "Filter",
                                "condition": "((`s`.`name`) = \"tom\")"
                            },
                            {
                                "#operator": "InitialProject",
                                "result_terms": [
                                    {
                                        "expr": "(`s`.`id`)"
                                    },
                                    {
                                        "expr": "`credentials`"
                                    }
                                ]
                            },
                            {
                                "#operator": "FinalProject"
                            }
                        ]
                    }
                }
            ]
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "2.82063ms",
        "executionTime": "2.765439ms",
        "resultCount": 1,
        "resultSize": 1917
    }
}

2 个答案:

答案 0 :(得分:2)

根据我的发现,如果您尝试创建索引,则必须排除不包含要编入索引的字段的文档。因此,对于上面的示例,我在name is not missing语句中添加了where,我的查询开始使用我的二级索引。

Couchbase site下面的模糊让我看到了这个发现

  

注意:MISSING项目未被索引器编入索引。要利用覆盖索引并使索引符合条件,查询需要排除索引键表达式求值为MISSING的文档。

答案 1 :(得分:1)

以下查询应使用您的索引。

select s.name, s.credentials 
from `security` s
where s.credentials is not missing and s.name = 'tom';

select s.name, credentials 
from `security` s unnest s.credentials
where s.credentials is not missing and s.name = 'tom';