在MongoDB中使用$where查询日期在不同的环境中表现不同

在MongoDB中使用$where查询日期在不同的环境中表现不同,mongodb,date,heroku,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),因为我会返回生日设置为

我使用$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),因为我会返回生日设置为1210222800000的对象,例如,5月8日。为什么会发生这种情况?如何让mongo返回正确的对象?

这看起来像是时区问题。我想你的约会都应该是当天的“午夜”。这个8小时休息

# TZ=UTC date -d @1210222800000
Tue Jun  8 08:00:00 UTC 40320
因为JSON实际上没有日期类型,所以您必须非常清楚转换发生在哪里。最佳实践是,应用程序负责在发送到数据库之前始终转换为UTC。(如果你只是想存储一个日期,就要去掉时间,否则你的日期比较就会出错。)


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

2.4.2本地和2.2.4远程,这会导致getDate方法的差异吗?2.2和2.4使用不同的Javascript引擎(spidermonkey vs V8)。