2016-02-13 68 views
1

我有一個Bluemix DB Cloudant與定義爲指數:查詢索引不會返回預期的數據

{ 
"index": { 
    "fields": [ 
    { "typ": "asc" }, 
    { "sen": "asc" }, 
    { "tim": "asc" } 
    ] 
}, 
"type": "json" 
} 

時,我有形式

{ 
    "selector": { 
    "tim": {"$gt": millisecs}, 
    "typ": "H" 
    }, 
    "fields": ["sen","val","tim"], 
    "sort": [ 
    { "typ": "asc" }, 
    { "sen": "asc" }, 
    { "tim": "asc" } 
    ], 
    "limit": readCount 
} 

它工作的查詢完美。如果我想要得到的一切,即刪除的條件typ="H",我得到的錯誤

「錯誤」:「no_usable_index」,「原因」:「有這個選擇沒有可用的指標。​​」

如果我有"typ" : { "$in": ["H", "T"] },我會得到相同的回答。我會期望更通用的查詢比帶額外選擇器的查詢更好。

我只是不明白這到底是怎麼!

+0

查看評論:http://stackoverflow.com/questions/35385834/query-index-in-cloudant-doesnt-return-expected-data/35398907?noredirect=1#comment59781819_35398907 – Ilya

回答

0

「典型」是索引的第一個字段,所以是排序的基礎。

「蒂姆」,如果是查詢的唯一元素,不走索引的優勢,因此它會觸發全表掃描,如果該查詢是允許的。

但是你可以要求明確地進行全表掃描,如果你添加:

"_id": { "$gt": null } 

the doc,你的情況是不是真的那樣,但我認爲這是暗示。

+0

我試着用相同的結果。我嘗試了當前的索引,並創建了另一個包含_id且都失敗的索引。我也嘗試過使用文本索引,儘管我仍然有一些排列可供嘗試,但它並不起作用。該文檔非常差 - 盡力而爲,但是從完全熟悉Cloudant的人的角度出發,他們無法明白爲什麼它很差。 –

+0

我同意某些部分缺少該文檔。對於索引,我認爲約束是你必須讓查詢中的第一個字段能夠使用它們。奇怪'_id'索引不起作用。 – Ilya

+0

@BrendanMurray你試過'「typ」:{「$ gt」:「」}'? – Ilya

0

你嘗試創建這些字段單獨的索引和運行相同的查詢?

+0

是的,加載不同的組合和排列。我最近沒有時間看這個,但我認爲我的下一個嘗試將通過一個觀點。 –

+0

https://docs.cloudant.com/cloudant_query.html#creating-selector-expressions「您可以通過組合運算符來創建更復雜的選擇器表達式,但對於類型爲json的Cloudant Query索引,不能使用'組合'或'數組邏輯「運算符(如$ regex)作爲查詢的基礎,只能使用諸如$ eq,$ gt,$ gte,$ lt和$ lte(但不是$ ne)的相等運算符作爲更復雜的查詢「。這可能是您在選擇器中使用「$ in」時遇到問題的原因。 – Sora