【问题标题】:N1QL secondary index not working with parameterized IN clauseN1QL 二级索引不适用于参数化 IN 子句
【发布时间】:2016-08-02 22:33:47
【问题描述】:

使用com.couchbase.client, java-client 版本2.2.7 我无法使使用参数化IN 子句的n1ql 二级索引正常工作。请参阅下面的示例索引、查询和 java 代码

索引

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";

提交查询的代码

public int getCountForDuration(Long startTime, Long endTime, Collection<String> ids){
    List<String> idList = new ArrayList<>(ids);
    JsonObject placeHolders = JsonObject.create()
                                        .put("ids", JsonArray.from(idList))
                                        .put("startTime", startTime)
                                        .put("endTime", endTime);
    N1qlQuery query = N1qlQuery.parameterized(COUNT_STATEMENT, placeHolders)            
    N1qlQueryResult result = bucket.query(query);
    ...
}

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

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

【问题讨论】:

  • 您是否在 IN 的右侧使用了固定数量的参数?也就是说,你的数组中有固定数量的元素吗?
  • 嘿,@geraldss 不,传递给我的集合中没有固定数字我无法保证用户将在 ids 变量中传递多少元素
  • @geraldss 重读您的评论我不确定我的示例是否符合固定条件。在运行时,当此方法被调用时,它将在调用该方法时被修复;但是大小可以根据不同的方法调用而改变。一个调用可能有 5 个 id,而下一个调用可能只传入 1 个

标签: java couchbase n1ql secondary-indexes


【解决方案1】:

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

例如只需type="entityType"即可查询以下索引

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

【讨论】:

    【解决方案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 不会出现在索引中,因此如果您不使用字段 已经受到索引设置的条件的约束,那么你 必须指定它没有丢失以确保可以转到 你的二级索引”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2020-12-07
      • 2010-09-25
      相关资源
      最近更新 更多