2014-02-05 25 views
3

有沒有人有一個針對超過30秒的文檔的集合的查詢的好方法。我正在創建一個清理工作人員,他們在特定狀態超過30秒後將其標記爲失敗。對於超過30秒的文檔,MongoDB查詢

這並不重要,但我使用mongojs這個。

每個文檔都有一個與其關聯的created時間。

回答

6

我們假設您的文檔有它插入或取決於否則修改是對你很重要的時間中有created_at或類似的領域。

您可能需要查看update中的multi選項以將更改應用於與查詢匹配的所有文檔,而不是迭代結果。設置你想要看過去應該是相當簡單

在shell語法,這應該是幾乎相同的驅動程序時:

db.collection.update({ 
    created_at: {$lt: time }, 
    state: oldstate 
}, 
{$set: { state: newstate } }, false, true) 

第一false是爲upserts不作任何意義在此用法中,第二個true標記爲multi文檔更新。

如果文件確實很短,而且之後您沒有其他需要,那麼您可以考慮capped collections。您可以爲這些選項設置total sizetime to live選項,自然插入順序有利於處理排隊條目。

3

你可以使用類似的東西:

var d = new Date(); 
d.setSeconds(d.getSeconds() - 30); 

db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {}); 
+0

我不知道如何與使用正確的格式得到一個日期對象查詢。這很好。謝謝! –

7

如果你想做到這一點使用蒙戈外殼:

db.requests.find({created: {$lt: new Date((new Date())-1000*60*60*72)}}).count() 

...會發現是超過72小時的文件( 「現在」 減去 「72 * 60 * 60 * 1000」 毫秒) 。 30秒將是1000 * 30。