3

I want to query a document from a MongoDB database where the condition is the outcome of a given calculation. I don't know if this is understandable, an analog SQL query might help:

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

Each tasks has a maxAge field which determines how often a task should run. If the maxAge is reached, the query should return that task which is then executed.

Because I lack the vocabulary to describe such a query it's hard to find anything about this topic. Please be forgiving if this is mentioned somewhere. :-)

My first reflex was: Let's map the whole collection to contain the calculated threshold for each task, but this seems a bit too much for such a simple query. I hope this isn' t the only solution to this. :-)

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 クエリを実行する際に現在問題が発生していることです。

この場合のより良いアプローチは、

re-write:t.lastRun < (NOW() - t.maxAge) to: (t.lastRun + t.maxAge) < NOW()

t.lastRun と t.maxAge の合計が計算され、挿入時に追加のフィールドに格納されます。したがって、結果のクエリは単一の比較のみを必要とします。

于 2012-08-23T20:47:52.357 に答える