鍍金池/ 問答/數(shù)據(jù)庫  HTML/ mongodb里面存的一個時間字段是string類型,如何通過時間來篩選數(shù)據(jù)?

mongodb里面存的一個時間字段是string類型,如何通過時間來篩選數(shù)據(jù)?

mongodb數(shù)據(jù)庫有個day字段存的是string類型如圖:

圖片描述

現(xiàn)在我要通過day字段來篩選不同時間段的數(shù)據(jù),但是下面這樣寫

 req.collections.dayTrainings.count({ 'phone': req.param('phone'), 'day': { $lte: theday } }, function (error, trainingCount) {})

因為是字符串類型所以查出的數(shù)據(jù)不對,我該如何操作,才能正確的查出一段時間的數(shù)據(jù)

回答
編輯回答
萌面人

強調(diào)一下,不要用字符串來存時間。如果已經(jīng)存了,盡早改成ISODate,因為早晚還會遇到其他問題。
首先,一個正常的epoch時間是32位(4字節(jié)),一個字符串日期至少是10個字節(jié)(如2018-06-12),字符串時間至少是19個字節(jié)(如2018-06-12 12:00:00),浪費空間浪費效率。
其次,字符串的時間無法進行正常的運算。正常的時間可以通過$year/$month/$day等運算符很方便地取出相應(yīng)的部分,字符串的時間……
再次,遇到時區(qū)問題要怎么辦?

最后說說你的問題。不知道theday是個什么值,所以無法考證我的推斷是否正確。
考慮以下兩個時間哪個更大?

  • timeA = '2018-6-12'
  • timeB = '2018-12-12'

常識來說我們肯定覺得timeB > timeA,但對計算機而言,timeA > timeB。這也是使用字符串存時間的諸多問題之一。機器比較時間是逐字節(jié)比較。前面5位大家都是'2018-',打個平手。第6位決定勝負,一個是6,一個是1,結(jié)果當然就是timeA > timeB。
所以如果上面的理由還不足以說服你使用ISODate,至少應(yīng)該補足剩下的那個0:'2018-06-12'。

2017年7月26日 17:28