2010-01-02 51 views
3

我遇到了在我的座標系中獲得正確結果的問題。 爲了解釋我的系統,我有這個簡單的數據庫,它有x_axis,y_axis和名稱列。我不需要獲取所有的數據,我只需要顯示它的一部分。couchdb中兩個關鍵範圍的問題

例如,我有一個座標系10:10(從x_axis -10到10,從y_axis -10到10),我想只顯示49個座標。在SQL查詢我能做到這一點是這樣的: 「選擇座標*其中X_AXIS> = -3和X_AXIS < = 3和Y_AXIS> = -3 Y_AXIS < = 3」

我嘗試這個功能,但沒有成功:

"by_range": { 
     "map": "function(doc) { emit([doc.x_axis, doc.y_axis], doc) }" 
    } 

by_range startkey = [ - 3,-3] & endkey = [3,3]

我的一個錯誤的結果:

-3x-3 -3x- 2 -3x-1 -3x0 -3x1 -3x2 -3x3 < - 應不顯示這一部分 - > -3x4 -3x5 -3x6 -3x7 -3x8 -3x9 -3×10 < - 不應顯示這部分結束 - > .....多達3x3的

給你一個更好的瞭解我在這裏的項目是要做出我想要的是截圖:

回答

2
by_range?startkey=[-3,-3]&endkey=[3,3] 

你正在使用這個像WHERE子句。 Couchdb不理解「startkey」和「endkey」中的值,它只是用它們來知道何時開始和停止輸出結果。

例如,採取以下結果集:

doc1 
doc2 
doc3 
doc4 

如果我申請此查詢:?

startkey = DOC2 & endkey = doc3的

的結果集將是:

doc2 
doc3 

要在您的示例中應用範圍,我會修改m AP功能:

function(doc) { 
if (doc.x <= 3 && doc.x >= -3 && doc.y <= 3 && doc.y >= -3) 
    emit([doc.x, doc.y], doc) 
} 

更新來處理動態範圍

根據Database Queries the CouchDB Way

「CouchDB的設計,讓你在大型數據集卓越的性能。但這意味着在運行查詢時無法將動態參數傳遞給地圖函數。「

所以,我們要做的動態範圍,則需要將鍵值的輸出改變爲單一值,所以你可以使用startkey和endkey參數

function(doc) { 
emit(doc.x * doc.y, doc) 
} 

使用此過濾器。

by_range?startkey=-9&endkey=9 

在你的應用程序,你可以通過執行類似

startkey = (x1*y1) 
endkey = (x2*y2) 
計算的起始和結束鍵0
+0

Hi anduk, 首先,請允許我在您的快速回復中感謝您。我明白你的觀點,但問題在於,如果你制定的條件不是動態的,它只適用於x/y -3到3.這些數字(-3和3)將根據選定的座標部分而改變。 有沒有辦法在這個視圖中傳遞請求參數?所以它會變得動態。像函數(doc,req)? 再次感謝! – Duasto 2010-01-03 04:59:05

+0

我已更新我的帖子 - 希望能解決它。 – andyuk 2010-01-03 17:09:41

0

你可以這樣做有多個按鍵WHERE子句並在此article描述的技術。