查询mongodb中存储为字符串的时间

时间:2014-05-17 18:43:46

标签: mongodb datetime nosql

我在mongodb中有一个集合,我分别存储日期和时间字符串。每个文档看起来都像这个

日期:“2014年5月16日”,   时间:“11:00”,   教练:{     coachId:“15b62940-1df8-42df-a30e-d52f4169c9f8”,     coachName:“xxxxxx xxxxx”,     coachPhone:“(xxx)xxx-xxxx”   },   _id:“53766924d95930406a3d5b4e”

如果我在Node js客户端中搜索特定时间范围内的文档,那么最好的方法是什么。这可以在查询时我是否需要以不同的格式存储日期和时间,以便$ lte,$ get等运算符工作 感谢

2 个答案:

答案 0 :(得分:0)

通过以两个字符串的形式抽象出一个时间点,你让生活变得悲惨。特别是当您使用美国日期格式时,字母排序不起作用。

每当您使用MongoDB中的时间点时,都应使用the building Date类型。在NodeJS中,此类型直接映射到Javascript Date类型。当您需要以比正常toString()更易读的形式格式化日期时,您可以在前端轻松完成此操作。

在数据库层,使用BSON日期可以按日期sort进行聚合,并使用date-based query operators

但是当你坚持保持这种方式时,可以使用$where-query使用Javascript函数将日期字符串和时间字符串转换为javascript Date对象,然后对其执行日期算术运算。这可能有用,但是将日期存储为日期可以避免这种缓慢而丑陋的解决方案。

答案 1 :(得分:0)

我设法根据Philipp的推荐解决了这个问题。 从我保存数据的客户端控制器,我发送日期类型。

var dateString = $('#datetimepicker').val();
var date = new Date(dateString);
$scope.AvailDates.push( {DateUTC:**date**}); 

AvailDates通过http post发送,保存到我的mongodb,在那里它被保存为Mongo Date类型:

{DateUTC: "2014-05-20T15:30:00.000Z"}

当另一个客户端进行基于日期的搜索时,我以与保存客户端相同的格式发送日期,然后在其上执行.toISOString():

var inputUTCDate =new Date(req.params.datetime);

将搜索结果发送到数据库时,我这样做:

collection.find({DateUTC:{$gte:inputUTCDate.toISOString()}).toArray(function(err, items) {}

在inputUTCDate上,我可以添加/减去时间,如果我需要时间范围并使用$ get和$ lte运算符并且它们工作正常