MongoDb:根据每个单据的计算查询单据

MongoDb:根据每个单据的计算查询单据,mongodb,Mongodb,我想从MongoDB数据库中查询一个文档,其中条件是给定计算的结果。我不知道这是否可以理解,模拟SQL查询可能会有所帮助: SELECT * FROM tasks AS t WHERE t.lastRun < (NOW() - t.maxAge) 从任务中选择*作为t,其中t.lastRun

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

SELECT * FROM tasks AS t WHERE t.lastRun < (NOW() - t.maxAge)
从任务中选择*作为t,其中t.lastRun<(NOW()-t.maxAge)
每个任务都有一个maxAge字段,用于确定任务应运行的频率。如果达到最大值,则查询应返回随后执行的任务

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

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

你可以试试

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

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

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

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

重写:t.lastRun<(NOW()-t.maxAge) 收件人:(t.lastRun+t.maxAge)
t.lastRun和t.maxAge之和将在插入时计算并存储在附加字段中。因此,生成的查询只需要一次比较。

除了Matt所说的之外,修改模式使其具有一个计算字段将不仅允许使用简单的查询来回答查询,而且还可以为该计算字段编制索引以进行更快的比较。