我试图在指定日期范围之间找到数据库中的文档。
var event = {
to : 1393454361,
from : 1393354361
};
我有event.from
和event.to
作为unix时间整数,我使用它来尝试只返回两个日期范围之间的事件:
db.events.find({
"event": "test",
"message.tableid": 123,
$where: function () {
return (
(event.from - this._id.getTimestamp()) > (event.from - event.to)
)
}
}).sort(
{ "message.time": -1 }
).forEach(function(error, x) {
if (error || !x) {
console.log("error getting items");
console.log("Current HPH in this range:");
console.log(hph);
} else {
console.log(
"Calc: ",
(event.from - x._id.getTimestamp() > (event.from - event.to))
);
if (event.from - x._id.getTimestamp() > (event.from - event.to)) {
hph = hph + 1;
}
}
})
出于某种原因,如果我使用if
来检查日期是否在范围之间,那么它就可以了。
但是当我将语句移到$where
- 子句时,会返回all
个文档。
我只是集合中的一堆文件看起来像这样:
{
"_id" : ObjectId("530cd8d610d28ebc27951eb8"),
"event" : "test",
"message" : {
"tableid" : 123
}
}
{
"_id" : ObjectId("530cd8d610d28ebc27952fb8"),
"event" : "test",
"message" : {
"tableid" : 123
}
}
任何想法>?
如果我尝试将此作为$where
来检查过去24小时,那么它可以正常工作:
$where: function () {
return Date.now() - this._id.getTimestamp() < (1 * 60 * 60 * 1000)
}
答案 0 :(得分:3)
您没有提供有效的JSON。 mongo shell 非常宽恕,其他事情则不然。
db.events.find({
"$where":
"function () {
return Date.now() - this._id.getTimestamp() < (1 * 60 * 60 * 1000)
}"
}, function(err, result) {
// test err and process result
});
由于它无效,条件无效。相当于{}
中的.find()
。
此外,尝试并重新考虑不使用$where。您只是丢弃了索引使用情况并强制进行全表扫描。
正如评论中所提到的,您可以简化的长路由逻辑。
答案 1 :(得分:0)
不要使用if语句或where子句,而是尝试在查询中使用$ gte和$ lt运算符。 阅读这篇文章: http://cookbook.mongodb.org/patterns/date_range/