我在_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"
}
_id
字段,这似乎只会发生。"_id": {"$gt":null}
添加到我的选择器有什么后果?这会扫描整个表而不是使用索引吗?感谢您的帮助,谢谢
答案 0 :(得分:3)
Cloudant Query可以使用Cloudant预先存在的主索引进行选择和范围查询,而无需在_id
字段中创建自己的索引。
不幸的是,索引在使用$nin
运算符时并没有真正帮助 - Cloudant必须扫描整个数据库以检查列表中没有的文档 - 索引不是真的让它进一步前进。
通过将操作符更改为$eq
,您可以使用索引的优势,可以快速有效地找到所需的记录。
简而言之,您尝试的查询效率低下。如果您的查询更复杂,例如相当于WHERE colour='red' AND _id NOT IN ['a','b']
,然后colour
上的Cloudant索引可用于在对剩余数据执行$nin
操作之前将数据集减少到合理的水平。