使用$ nin的Cloiudant此选择器没有可用的索引

时间:2016-08-31 23:45:56

标签: cloudant

我在_id上的cloudant中创建了一个JSON索引,如下所示:

{
  "index": {
    "fields": [ "_id"]
  },
  "ddoc": "mydesigndoc",
  "type": "json",
  "name": "myindex"
}

首先,除非我指定了索引名称,否则cloudant无法区分我创建的索引和_id的默认基于文本的索引(如果确实如此,那么这是我相信的错误)

我针对db的_find端点运行了以下查询:

{
  "selector": {
        "_id": {
            "$nin":["v1","v2"]
        }
    },
    "fields":["_id", "field1", "field2"],
    "use_index": "mydesigndoc/myindex"
}

结果是这个错误: {"error":"no_usable_index","reason":"There is no index available for this selector."}

如果我将"$nin":["v1","v2"]更改为"$eq":"v1",那么它可以正常工作,但这不是我追求的查询。

所以为了得到我想要的东西,我必须选择"_id": {"$gt":null},现在看起来像:

{
  "selector": {
        "_id": {
            "$nin":["v1","v2"],
            "$gt":null
        }
    },
    "fields":["_id", "field1", "field2"],
    "use_index": "mydesigndoc/myindex"
}
  1. 为什么会这样?如果我在选择器中使用_id字段,这似乎只会发生。
  2. "_id": {"$gt":null}添加到我的选择器有什么后果?这会扫描整个表而不是使用索引吗?
  3. 感谢您的帮助,谢谢

1 个答案:

答案 0 :(得分:3)

Cloudant Query可以使用Cloudant预先存在的主索引进行选择和范围查询,而无需在_id字段中创建自己的索引。

不幸的是,索引在使用$nin运算符时并没有真正帮助 - Cloudant必须扫描整个数据库以检查列表中没有的文档 - 索引不是真的让它进一步前进。

通过将操作符更改为$eq,您可以使用索引的优势,可以快速有效地找到所需的记录。

简而言之,您尝试的查询效率低下。如果您的查询更复杂,例如相当于WHERE colour='red' AND _id NOT IN ['a','b'],然后colour上的Cloudant索引可用于在对剩余数据执行$nin操作之前将数据集减少到合理的水平。