2013-05-04 65 views
3

我在CB中有一個文檔,其中有兩個日期,一個開始日期和一個結束日期。比方說,產品的價格折扣。今天開始10%折扣,下週五結束。我怎樣才能從CB獲得今天有效折扣的所有文件?Couchbase文檔日期搜索 - DateTime.Now()

我做了一個視圖,並在它下面的:

var dt = new Date(); 

它得到今天的日期。然後我可以做一個簡單的

if(doc.FromDate < dt && doc.ToDate > dt){ emit([ ..... ]); 

這個過濾文件,我想如何。但是......

問題

這是一個很好的方法重新視圖和索引更新?由於日期改變,指數會每天更新嗎?試圖理解CB在這方面的工作

這種搜索的最佳方法是什麼?如果不可能,請告訴我!

乾杯

羅賓

注:請注意,這個問題是不是這樣here或本here

回答

2

只是因爲系統日期改變該索引將不會被更新,則必須更新該文件。也視圖索引器不允許你傳遞用戶定義的任何參數。在這種情況下,您應該發出數據並使用日期作爲過濾查看查詢的關鍵的一部分。我猜也是SQL索引的相同行爲。什麼時候該文件將編入索引,在你的榜樣,你是凍結​​時間戳當文檔已被索引你無法預測,它甚至不是當它被改變

+1

嗨,感謝您的答覆。我仍然有點困惑。我怎樣才能得到那些有當前包括日期範圍的文件呢?我不能使用開始和結束鍵,因爲今天不一定匹配'from'和'to'日期。所以你在這方面的建議是行不通的? – 2013-05-05 00:42:30

5

讓我們要澄清的東西在這裏的時間:

  • map()函數用於創建/更新磁盤上的索引,並且這僅發生在將文檔保存到磁盤上之後。這就是爲什麼在map reduce中使用date.now()並不合理。所以你要做的是發射日期例如發出(dateToArray(doc.startDate));

  • 然後當你查詢視圖(索引)時,你可以使用startkey & endkey來做一個範圍查詢。

& startkey = [2013,4,16] & endkey = [2013,4,24]

+0

嘿,謝謝你。是的,我完全忘記了日期,現在它是'靜態'。我的錯。!我想這樣做的唯一方法是在發射中有兩個值 - > emit [(doc.from,doc.to),null]。什麼是我可以使用的'最小'(大多數是過去的)日期。即'開始日期'可以是昨天或之前的任何日期。我需要今天的日期> =從日期起的所有記錄。我無法傳遞[null,2013/4/5],因爲null會讓我一切正常,並忽略結束鍵?按照從左到右的原則重新操作。 – 2013-05-06 21:09:55

+0

不確定要理解問題,但您使用的日期僅僅是JavaScript日期,因此您可以使用此處定義的內容:https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Date – 2013-05-14 10:10:21