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

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

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

圖片描述

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

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

因?yàn)槭亲址愋退圆槌龅臄?shù)據(jù)不對(duì),我該如何操作,才能正確的查出一段時(shí)間的數(shù)據(jù)

回答
編輯回答
萌面人

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

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

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

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

2017年7月26日 17:28