我正在尝试使用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中运行它,则会按预期返回记录 -
==========
更新
我的问题出现在我的代码的其他地方 - 我在传递给FindOne
查询的单独参数中遇到了类型不匹配问题。
如documentation中所述,并经Christian P确认,我可以直接在sDate
查询中使用我的Javascript日期对象FindOne
。
我使用typeOf
函数(找到here)来确认sDate
确实是Date对象。
因此,在检查了我的实际代码中的所有其他变量之后,我在其他地方发现了问题,与Date对象/参数无关。
答案 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);
}
);