N1QL二级索引不使用参数化的IN子句

时间:2016-08-02 22:33:48

标签: java couchbase n1ql secondary-indexes

使用=AND(NOT(ISBLANK(A1)),LEN(A1)=0) 版本com.couchbase.client, java-client我无法获得使用参数化IN子句的n1ql二级索引。请参阅下面的示例索引,查询和Java代码

  

索引

2.2.7
  

查询

CREATE INDEX `indexName` ON `bucketName`(id,docType) USING GSI ;
  

提交查询的代码

public static final String COUNT_STATEMENT = "select count(*) as count " +
            "from bucketName " +
            "where docType = 'docId' " +
            "and id IN $ids " + 
            "and publishTimestamp between $startTime and $endTime";

在添加参数化之前,我的查询正确使用了这个二级索引。如果我使用主索引,我的查询也有效。

  

我的问题是如何创建二级索引   将由我的查询使用。

2 个答案:

答案 0 :(得分:2)

我通过添加额外的is not missing子句来解决这个问题,并且出于某种原因,这解决了这个问题。同样的解决方案在我的通行证中起作用。这是更新的查询:

public static final String COUNT_STATEMENT = "select count(*) as count " +
        "from bucketName " +
        "where id is not missing " + 
        "and docType = 'docId' " +
        "and id IN $ids " + 
        "and publishTimestamp between $startTime and $endTime";
  

@Ben Wilde评论 -

     

“需要”缺少“的原因是因为第一次进入   索引(在'this'case id中)不能丢失。所以有的文件   缺少的id不会出现在索引中,所以如果你不使用字段   已经受索引设置的条件限制,那么你   必须指明它不会丢失,以确保可以去   你的二级索引“

答案 1 :(得分:2)

索引中的第一个条目(在您的情况下为id)不能丢失。因此,缺少id的文档将不在索引中。因此,如果您不使用已受索引条件约束的字段,则必须指定它不会丢失,以确保可以转到您的二级索引。

e.g。您可以使用type="entityType"

查询以下索引

CREATE INDEX `indexName` ON `bucketName`(type) WHERE `type`="entityType"