3

我想从 MongoDB 数据库中查询一个文档,其中条件是给定计算的结果。我不知道这是否可以理解,模拟 SQL 查询可能会有所帮助:

SELECT * FROM tasks AS t WHERE t.lastRun < (NOW() - t.maxAge)

每个任务都有一个 maxAge 字段,用于确定任务应该运行的频率。如果达到 maxAge,则查询应返回该任务,然后执行该任务。

因为我缺乏描述这样一个查询的词汇,所以很难找到关于这个主题的任何内容。如果在某处提到这一点,请原谅。:-)

我的第一个反应是:让我们映射整个集合以包含每个任务的计算阈值,但这对于这样一个简单的查询来说似乎有点太多了。我希望这不是唯一的解决方案。:-)

4

2 回答 2

2

你可以试试

db.tasks.insert({lastRun:new ISODate(), maxAge:100});

db.tasks.find({ $where: "this.maxAge < (new ISODate()-this.lastRun)"});
于 2012-08-23T16:24:45.570 回答
1

使用 $where 的问题是它无法被索引,并且当前在服务器上运行 javascript 查询存在问题,因为 javascript 引擎是单线程的。

在这种情况下,更好的方法是

将:t.lastRun < (NOW() - t.maxAge) 重写为: (t.lastRun + t.maxAge) < NOW()

插入时将计算 t.lastRun 和 t.maxAge 的总和并将其存储在附加字段中。因此,生成的查询只需要一次比较。

于 2012-08-23T20:47:52.357 回答