mongo $返回一切的地方

时间:2014-02-25 17:41:51

标签: javascript node.js mongodb mongodb-query

我试图在指定日期范围之间找到数据库中的文档。

 var event = {
            to : 1393454361,
            from : 1393354361
};

我有event.fromevent.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)  
 }

2 个答案:

答案 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/