使用$ where查询MongoDB中的日期在不同环境中的行为方式不同

时间:2013-05-07 19:17:31

标签: mongodb date heroku

我正在使用$ where按月和日期查询对象,使用如下代码来获取具有5月7日的出生日期的UserInfo集合:

db.UserInfo.find( function() {
  var d = new Date(this.Birthdate);
  return d.getDate() === 7 && d.getMonth() === 4;
});

这在本地完美运行,返回生日设置为5月7日的UserInfo对象。但是,这会远程中断(Heroku + Mongolab),因为我将例如Birthdate设置为1210222800000(即5月8日)的对象返回。为什么会发生这种情况?如何让mongo返回正确的对象?

1 个答案:

答案 0 :(得分:2)

看起来像是时区问题。我假设您所在的日期都应该是当天的“午夜”。这个是8个小时。

# TZ=UTC date -d @1210222800000
Tue Jun  8 08:00:00 UTC 40320

由于JSON实际上没有Date类型,因此您必须非常清楚转换发生的位置。最佳做法是,应用程序有责任在发送到数据库之前始终转换为UTC。 (如果你只想存储一个日期,那就去掉时间。否则你的日期比较就会出错。)

最佳做法是在UTC时区运行数据库服务器和应用程序服务器。 (如果需要,应用程序应转换为本地时间。通常是每个用户,因为用户通常位于不同的时区。)