mongodb里面存的一个时间字段是string类型,如何通过时间来筛选数据?

mongodb数据库有个day字段存的是string类型如图:

图片描述

现在我要通过day字段来筛选不同时间段的数据,但是下面这样写

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

因为是字符串类型所以查出的数据不对,我该如何操作,才能正确的查出一段时间的数据

阅读 7.6k
1 个回答

强调一下,不要用字符串来存时间。如果已经存了,尽早改成ISODate,因为早晚还会遇到其他问题。
首先,一个正常的epoch时间是32位(4字节),一个字符串日期至少是10个字节(如2018-06-12),字符串时间至少是19个字节(如2018-06-12 12:00:00),浪费空间浪费效率。
其次,字符串的时间无法进行正常的运算。正常的时间可以通过$year/$month/$day等运算符很方便地取出相应的部分,字符串的时间……
再次,遇到时区问题要怎么办?

最后说说你的问题。不知道theday是个什么值,所以无法考证我的推断是否正确。
考虑以下两个时间哪个更大?

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

常识来说我们肯定觉得timeB > timeA,但对计算机而言,timeA > timeB。这也是使用字符串存时间的诸多问题之一。机器比较时间是逐字节比较。前面5位大家都是'2018-',打个平手。第6位决定胜负,一个是6,一个是1,结果当然就是timeA > timeB
所以如果上面的理由还不足以说服你使用ISODate,至少应该补足剩下的那个0:'2018-06-12'。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题