2013-05-04 191 views
0

首先,請原諒我的英語。

現在,我面臨的問題是,現有數據庫在「startOn」對象內有一個名爲「Date」的列。這意味着,它使得像「startOn.Date」,它有像yyyy/dd/mm的數據。假設,我有一個如下記錄:2013/06/05。問題是,我需要從2 days7 days之後的數據。這意味着$gte: +2 days$le: +7 days

我試過幾個方法類似

$gte: use("RFCtoClean")(new Date(year, month - 1, day + 2)), 

RFCtoClean是:

function RFCtoClean(d) { 
d = new Date(d); 
return d.getUTCFullYear() + "/" + pad(d.getUTCDate()) + "/" + pad(d.getUTCMonth() + 1);} 

這將返回什麼,但即便是下面的代碼的回調返回undefined

var currentDate = new Date(new Date().getTime() + 24 * 60 * 60 * 1000); 
       var day = currentDate.getDate() 
       , month = currentDate.getMonth() + 1 
       , year = currentDate.getFullYear(); 
Event.find({ 
        author: user_id, 
        "startOn.Date": { 
         $gte: use("RFCtoClean")(new Date(year, month - 1, day + 2)), 
         $le: use("RFCtoClean")(new Date(year, month - 1, day + 7)) 
        } 
       }, '_id title location startOn attendees', { 
        limit: limit 
       }) 
       .sort({_id: -1}) 
       .execFind(function(err, events) { 
    // events variable is undefined here and empty err object, 
    }); 

誰能幫我出來嗎?

+0

你是說,該文件包含日期爲一個字符串? 「YYYY/MM/DD」?你想把它作爲日期類型而不是字符串來操作? – 2013-05-05 05:36:33

+0

真的是「YYYY/DD/MM」而不是「YYYY/MM/DD」?如果是MM/DD,那麼你實際上可以比較字符串,但是如果它是DD/MM就像你建議的那樣,你將不得不使用$ where和cast到日期。如果該字段是一個字符串,mongo會將它當作一個字符串對待,而不是日期,例如,字符串「2000/31/01」比「2000/01/02」更大即使月份較高,但「2000/01/31」將會「小於」「2000/02/01」。 – numbers1311407 2013-05-05 19:34:40

+0

如果日期處於這種完全奇怪和非標準的格式,那麼這不是真正的問題數據有效性嗎?即沒有什麼會以這種格式讀取日期 - 所以不應該將整個集合修復爲具有「正常」格式的日期並從現在開始清理它。 – 2013-05-05 20:13:47

回答

0

你得到一個字符串的日期,就像這樣"2013/06/05" - 它看起來像你知道如何獲得兩天前或七天後的字符串,對吧?所以,你將有:

from="2013/06/03; 
till="2013/06/12; 

現在只是做一個定期的發現:

db.data.find({ 
       "startonDate" : { 
        $gte: from, 
        $lte: till 
       } 
      }); 
+1

如果日期字符串的格式設置爲「yyyy/mm/dd」,則此*會*起作用,但日期似乎被格式化(奇怪)爲「yyyy/dd/mm」。如果確實如此,則日期優先於月份,這意味着簡單的字符串比較將失敗。 – numbers1311407 2013-05-05 19:41:43