2017-06-06 34 views
1

我目前在按ID查找集合時面臨非常緩慢/無響應。我在分區集合中有大約200萬份文檔。如果使用partitionKey和id的反應是立即在Azure DocumentDB上通過ID查詢沒有響應

SELECT * FROM c WHERE c.partitionKey=123 AND c.id="20566-2" 

如果我嘗試只用ID

SELECT * FROM c WHERE c.id="20566-2" 

的響應不會返回查找文檔,Java客戶端似乎凍結和我一直在使用同樣的情況Azure門戶的數據資源管理器。我也試着查找另一個不是id或partitionKey的字段,並且響應總是返回。當我嘗試從Java客戶端選擇時,我總是設置標誌來啓用交叉分區查詢。

接下來的事情是嘗試避免字符「 - 」的ID,以測試是否該字符塊查詢(反正我是沒找到文檔上的任何東西)

+0

您是否可以從門戶運行相同的查詢? – Mikhail

+0

沒有來自門戶的相同查詢不會返回任何東西 –

+0

您可以添加您的java代碼嗎?我可以幫助更多......大致上,當您查詢分區表時,您必須提供分區鍵或打開交叉分區查詢,默認情況下是關閉的,因爲您應該使用nosql很少這樣做。 –

回答

1

的問題與您的Java代碼。由於Azure DocumentDB Java SDK封裝了DocumentDB REST API,因此根據REST API Query Documents的引用,如@ DanCiborowski-MSFT所述,頭文件x-ms-documentdb-query-enablecrosspartition解釋了您的問題原因,如下所示。

X-MS-documentdb查詢-enablecrosspartition
要求/類型:可選/布爾
說明:如果集合是分區的,這個必須設置設爲True允許跨多個分區執行。針對單個分區鍵或針對單分區集合進行篩選的查詢無需設置標題。

所以你需要設置True,從而實現跨分區跨多個分區查詢,而不在通過條款通過FeedOption類的實例的方法queryDocuments一個partitionKey,如下圖所示。

FeedOptions queryOptions = new FeedOptions(); 
queryOptions.setEnableCrossPartitionQuery(true); // Enable query across multiple partitions 
String collectionLink = collection.getSelfLink(); 
FeedResponse<Document> queryResults = documentClient.queryDocuments(
    collectionLink, 
    "SELECT * FROM c WHERE c.id='20566-2'", queryOptions); 
+0

有關該問題與Java代碼無關,因爲使用Azure門戶的行爲也是相同的。無論如何,我已經使用enableCrossPartitionQuery標誌,但它不起作用。使用Azure Portal不需要此標誌,因爲查詢時不使用partitionKey,而是使用與查詢起作用的id不同的字段。例如'SELECT * FROM c WHERE c.anotherFieldThatIsntPartitionOrId ='BLAHBLAHBLAH'' –

+0

@FedericoPaparoni請嘗試使用Fiddler來捕獲API調用來檢查什麼是異常的。 –

+0

使用像Fiddler的東西我可以看到,當我進行阻塞調用時,服務器返回一個JSON對象,就像這個'{「_rid」:「vFwmAPVJtgA =」,「Documents」:[{「id」:「1697-1」, 「_self」: 「DBS \/vFwmAA == \/colls \/vFwmAPVJtgA = \ /文檔\/vFwmAPVJtgADAAAAAAAAAA == \ /」, 「_ RID」: 「vFwmAPVJtgADAAAAAAAAAA ==」, 「_ TS」:1496737515, 「_ partitionKeyValue」: 91}],「_ count」:1}'但瀏覽器無論如何都不會顯示Azure Portal中的任何內容 –