使用FindOne按日期范围查询MongoDb(通过Nodejs本机驱动程序)

时间:2014-06-20 09:13:04

标签: node.js mongodb

我正在尝试使用FindOne语句中的日期范围来查询MongoDb,但我无法让它工作。我正在使用Nodejs本机驱动程序。我尝试了各种选择,但没有任何东西可以恢复预期的记录。

这是我的伪代码 -

console.log(sDate);                    // displays  Fri Jun 20 2014 10:00:00 GMT+1000 (AUS Eastern Standard Time)
var sDateISO = sDate.toISOString();
console.log(sDateISO);                 // displays  2014-06-20T00:00:00.000Z 

// all of these return null object
db.collection('events').findOne(
  { eventStartDate: { $lte: new Date(sDate)}},
  function(err, obj) { console.dir(obj); }        // displays  null
);

db.collection('events').findOne(
  { eventStartDate: { $lte: (sDate) }},
  function(err, obj) { console.dir(obj); }        // displays  null
);

db.collection('events').findOne(
  { eventStartDate: { $lte: new Date(sDateISO) }},
  function(err, obj) { console.dir(obj); }        // displays  null
);

db.collection('events').findOne(
  { eventStartDate: { $lte: (sDateISO) }},
  function(err, obj) { console.dir(obj); }        // displays  null
);

但是,如果我在RoboMongo中运行它,则会按预期返回记录 -

enter image description here

==========

更新

我的问题出现在我的代码的其他地方 - 我在传递给FindOne查询的单独参数中遇到了类型不匹配问题。

documentation中所述,并经Christian P确认,我可以直接在sDate查询中使用我的Javascript日期对象FindOne

我使用typeOf函数(找到here)来确认sDate确实是Date对象。

因此,在检查了我的实际代码中的所有其他变量之后,我在其他地方发现了问题,与Date对象/参数无关。

1 个答案:

答案 0 :(得分:1)

ISODate是MongoDB shell中Date对象的包装器。 Robomongo嵌入了与mongo shell相同的JavaScript引擎,这就是你的查询在RoboMongo中工作的原因。

要查询日期范围,您只需在查询中使用Date对象:

db.collection('events').findOne(
  { eventStartDate: { $lte: sDate}},
  function(err, obj) { 
      console.dir(obj); 
  }
);