2014-05-07 57 views
0

我在CouchDB中設置文檔的兩者之間我在這裏提到的一個樣本文檔:CouchDB的地圖功能來獲取數據的日期

{ 
"_id": "26", 
"_rev": "1-53ac67e9ec4b4ce8ffa9cd609e107aaf", 
"customer_name": "Vadilal", 
"type": "trip", 
"duration": "10 hours 27 mins", 
"end_time": "Jan 1, 2014 10:11:00 PM", 
"start_time": "Jan 11, 2014 8:46:00 AM", 
} 

如果我通過timestamp(key)從URL,如果是在start_time之間和end_time然後我想獲得文檔。

例子:

假設URL會是這樣

.../trip/_design/trip/_view/trip?key="Jan 10, 2014 8:46:00 AM" 

在這裏,我通過時間戳Jan 10, 2014 8:46:00 AM所以start_time和上面提到的文檔的end_time之間進來,在這種情況下,我需要取剩餘的信息。

請幫忙弄清楚這個問題,這對我很有幫助。

我已經寫功能象下面這樣:

function(doc){ 
    if(doc.type=="trip"){ 
    var startTime=new Date(doc.start_time); 
    var endTime=new Date(doc.end_time); 
    emit([startTime.getTime(),endTime.getTime()], doc); 
    } 

,並呼籲網址如下:

../trip/_design/trip/_view/trip?startkey=[1390086890000]&endkey=[1390086890000,{}] 

高於一個正確的按照我的要求???

+0

任何人都可以幫助..... –

回答

1

這不幸是不可能的。你的要求有兩個問題。

視圖是由一個關鍵

安排你可以寫由開始鍵或分別結束鍵這樣的視圖索引文件。

function(doc){ 
     emit(doc.start_time, doc_id); // amend with end key to index by end key. 
    } 

您可以在查詢中使用三個參數:

  • 關鍵 - 匹配的精確關鍵字
  • startkey - 匹配是大於或等於開始鍵
  • endkey所有文件 - 匹配所有大於或等於結束鍵的文檔

該排序ing問題

根據類型的不同,索引鍵將按字母順序或整數排序。 因此,如果您的視圖trip使用開始鍵這樣的:

.../trip/_design/trip/_view/trip?start_key="Jan 10, 2014 8:46:00 AM" 

你可以返回大於或等於字符串「2014年1月10日......」,這將是「1月11日真正的所有值, 2014「或」2014年1月31日「,但」2011年7月22日「會出現誤報,或者」2014年2月1日「的誤報爲F < J.

爲了解決這個問題,你將不得不開始日期轉換的東西,可以按時間順序如進行排序:

這兩種都會正確排序。

你能解決你的問題

是的,但有一點客戶端代碼。這裏的食譜:

  • 創建兩個視圖trip/by_start_datetrip/by_end_date分別返回開始和結束日期爲按鍵。按照上面第二部分的排序方式。
  • 獲取兩套文檔。
  • 集1應該返回你的日期之前開始的所有文件:..._view/by_start_date?endkey=[your_date]
  • 組2應該回到你的日期之後結尾的所有文件:..._view/by_end_date?startkey=[your_date]
  • 然後,您有兩套文件的ID和你的意願後的結果成爲這些集合中的那些文檔。

進一步優化

在上面的解決方案,你可能只是得到太多返回的值來處理。您可以使用CouchDB在多個值上鍵入的功能進一步削減它。主要由兩個開始和結束日期如下:

function(doc){ 
     var start_time = some_conversion_function(doc.start_time); 
     var end_time = some_conversion_function(doc.end_time); 
     emit([start_time, end_time], doc_id); 
    } 

如果您有開始時間和結束時間之間的最大差異的更多細節,你可以用它來進一步減少每個組的文件。以下示例將返回在date之前X天不遲於date開始的文檔,並且不遲於date之後的X天結束。

..._view/by_start_date?startkey=[date-X,]&endkey=[date, date+X] 

您可以將類似的邏輯應用於by_end_date視圖。

+0

我已經寫功能象下面這樣: 功能(DOC){ 如果(doc.type == 「跳閘」){ \t VAR STARTTIME =新的日期(doc.start_time ); \t var endTime = new Date(doc.end_time); \t emit([startTime.getTime(),endTime.getTime()],doc); } 並調用URL如下: ../跳閘/ _design /跳閘/ _view /跳閘startkey = [1390086890000&endkey = [1390086890000,{}] 高於一個正確根據我的要求?? ? –

+0

按時期排序是正確和好的。我相信你不得不使用兩個查詢並獲取文檔列表(我只會返回'doc._id'而不是完整的文檔。然後,您有兩個列表,其中一個doc._id在您的日期之前開始,另一個列表中的所有doc._id都在您的日期之後結束。將這兩個列表相交以找到那些在您的日期之前開始並結束的文檔。這就是我在「你能解決問題」一節中解釋過的。 – Hans

+0

我已經創建了兩個視圖by_start_date和by_end_date。並調用兩個視圖,如http:// localhost:5984/trip/_design/by_start_date/_view/by_start_date?endkey = [15677878890000] http:// localhost:5984/trip/_design/by_end_date/_view/by_end_date?startkey = [1390086890000 ]但我如何根據我的要求獲得記錄。 –