mongodb数据库有个day字段存的是string类型如图:
现在我要通过day字段来筛选不同时间段的数据,但是下面这样写
req.collections.dayTrainings.count({ 'phone': req.param('phone'), 'day': { $lte: theday } }, function (error, trainingCount) {})
因为是字符串类型所以查出的数据不对,我该如何操作,才能正确的查出一段时间的数据
mongodb数据库有个day字段存的是string类型如图:
现在我要通过day字段来筛选不同时间段的数据,但是下面这样写
req.collections.dayTrainings.count({ 'phone': req.param('phone'), 'day': { $lte: theday } }, function (error, trainingCount) {})
因为是字符串类型所以查出的数据不对,我该如何操作,才能正确的查出一段时间的数据
3 回答2.6k 阅读✓ 已解决
1 回答920 阅读✓ 已解决
2 回答1.2k 阅读
1 回答881 阅读✓ 已解决
2 回答1.6k 阅读
2 回答604 阅读✓ 已解决
2 回答1k 阅读
强调一下,不要用字符串来存时间。如果已经存了,尽早改成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'。