MongoDb:根据每个文档的计算查询文档

3

我想从MongoDB数据库中查询一个文档,其中条件是特定计算的结果。 我不知道这是否容易理解,类似于SQL查询可能有所帮助:

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

每个任务都有一个maxAge字段,确定任务应该运行的频率。如果达到maxAge,则查询应返回该任务,然后执行该任务。
由于我缺乏描述这种查询的词汇,很难找到关于此主题的任何信息。如果已经提到了这一点,请谅解。:-)
我的第一反应是:将整个集合映射为包含每个任务计算出的阈值,但对于这样一个简单的查询来说,这似乎有点过于复杂。我希望这不是唯一的解决方案。:-)
2个回答

2
你可以尝试:
db.tasks.insert({lastRun:new ISODate(), maxAge:100});

db.tasks.find({ $where: "this.maxAge < (new ISODate()-this.lastRun)"});

1
使用$where的问题在于它无法被索引,并且目前在服务器上运行javascript查询存在问题,因为javascript引擎是单线程的。
在这种情况下更好的方法是重新编写:
t.lastRun < (NOW() - t.maxAge) to: (t.lastRun + t.maxAge) < NOW()
t.lastRun和t.maxAge的总和将在插入时计算并存储在一个额外的字段中。因此,所得到的查询只需要进行一次比较。

1
仅补充一下Matt所说的,修改模式以拥有单个计算字段不仅可以使用简单查询回答查询,而且还可以为更快的比较建立索引。 - Sridhar Nanjundeswaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接