2015-07-03 89 views
1

我想了解如何在DocumentDB中創建查詢其中子句數學比較器裏面。DocumentDb「where」從句與數學表達式

例如,我用this demonstrator來了解如何進行「大於」比較:表達式AND food.version > 0似乎工作得很好。

這是根據我試用portal.azure.com documentdb查詢資源管理器和結果。我不明白爲什麼在某些情況下(QUERY3)出現錯誤,並且(可選)如何在portal.azure.com上獲取錯誤詳細信息?!

測試:

>>> QUERY1 >> 
SELECT d.id, 
     d.name, 
     d.lastUpdateTime 
FROM d 
>>> RESULT1 >> 
[ 
    { 
    "id": "558d6007b909e8dfb2286e7b", 
    "name": "cSimpleSIMS_ici", 
    "lastUpdateTime": 1435589982672 
    }, 
    { 
    "id": "558d6009b909e8df18296e7b", 
    "name": "didier", 
    "lastUpdateTime": 1435330811285 
    }, 
    { 
    "id": "558d600ab909e8df28296e7b", 
    "name": "cDoubleSIMD_ici", 
    "lastUpdateTime": 1435331176750 
    }, 
    { 
    "id": "558d600bb909e8df55296e7b", 
    "name": "george", 
    "lastUpdateTime": 1435330813519 
    } 
    (...) 
] 

>>> QUERY2 >> 
SELECT d.id, 
     d.name, 
     d.lastUpdateTime 
FROM d 
WHERE (d.name='george') 

>>> RESULT2 >> 
[ 
    { 
    "id": "558d600bb909e8df55296e7b", 
    "name": "george", 
    "lastUpdateTime": 1435330813519 
    } 
] 

>>> QUERY3 >> 
SELECT d.id, 
     d.name, 
     d.lastUpdateTime 
FROM d 
WHERE (d.lastUpdateTime > 14) 
>>> RESULT3 IN ERROR! 

>>> QUERY4 >> 
SELECT d.id, 
     d.name, 
     d.lastUpdateTime 
FROM d 
WHERE (d.name='george' AND d.lastUpdateTime > 14) 

>>> RESULT4 >> 
[ 
    { 
    "id": "558d600bb909e8df55296e7b", 
    "name": "george", 
    "lastUpdateTime": 1435330813519 
    } 
] 


>>> QUERY5 >> 
SELECT d.id, 
     d.name, 
     d.lastUpdateTime 
FROM d 
WHERE (d.name='george' AND d.lastUpdateTime > 1435330813519) 

>>> RESULT5 >> 
[] 

回答

4

這裏的要點...

今天,DocumentDB所有JSON性質由哈希索引得到自動索引;這意味着使用相等運算符(例如WHERE d.name= "george")的查詢速度非常快。

另一方面,範圍查詢(例如WHERE d.lastUpdateTime > 14)需要範圍索引以有效地操作。如果沒有範圍索引,範圍查詢將需要掃描所有文檔(如果請求傳入頁眉x-ms-documentdb-query-enable-scan,我們允許)。

您發出的同時具有相等和範圍過濾器的查詢(例如WHERE d.name='george' AND d.lastUpdateTime > 14)成功,因爲相等過濾器大大縮小了要掃描的文檔集。

TL; DR:有兩件事情,你可以在這裏做擺脫錯誤的:

  1. 創建一個自定義的索引策略,添加了一系列指數數值類型。索引策略的文檔可以在here找到。

  2. 以編程方式(不通過Azure門戶)發出您的查詢以設置x-ms-documentdb-query-enable-scan標頭以允許掃描範圍查詢。

P.S.我會推動爲你改進Azure門戶。

現在...... Azure門戶中似乎存在一些問題 - 我將推動這些問題爲您解決。

錯誤:異常消息被截斷

看起來異常消息的有意義的部分使用Azure的門戶網站時,被截斷了 - 這是毫無布埃諾。什麼應該被顯示爲:

Microsoft.Azure.Documents.DocumentClientException: Message: {"Errors":["An invalid query has been specified with filters against path(s) that are not range-indexed. Consider adding allow scan header in the request."]} 

缺少特點:在查詢瀏覽器啓用掃描

有設置x-ms-documentdb-query-enable-scan頭目前不會在Azure門戶網站的查詢探險暴露的能力。我們將爲此添加一個複選框或其他內容。

1

要添加到aliuy的回答,我們正在進行一項更改,以改善此處的開發人員體驗 - 數字的默認索引策略將從哈希更改爲範圍索引,因此您無需標題或覆蓋索引策略以執行範圍查詢。