2016-03-23 145 views
3
之間的時間段

如果我有文檔保存在我的MongoDB以下模式:的MongoDB:查詢兩個日期字段

{ 
    createdDate: Date, 
    lastUpdate: Date 
} 

是可以查詢的文件,其中的時間創作和之間的週期最後更新是例如大於一天?

回答

6

最好的選擇是使用$redact聚集流水線階段:

db.collection.aggregate([ 
    { "$redact": { 
     "$cond": { 
      "if": { 
       "$gt": [ 
        { "$subtract": [ "$lastUpdate", "$createdDate" ] }, 
        1000 * 60 * 60 * 24 
       ] 
      }, 
      "then": "$$KEEP", 
      "else": "$$PRUNE" 
     } 
    }} 
]) 

那麼您正在尋找在離差小於一天毫秒值越大毫秒值。 $subtract對差異進行數學運算,當兩個日期相減時,返回差值(以毫秒爲單位)。

$redact運算符采用邏輯表達式作爲「if」,並且其中該條件爲true它在「then」中執行的操作是$$KEEP該文檔。如果是false,則文檔將從$$PRUNE的結果中刪除。

請注意,由於這是一個邏輯條件而不是設定值或值的範圍,因此不使用「索引」。

由於聚合流水線中的操作是本地編碼的,因此這是您可以通過這種語句執行的最快速度。

替代方法是使用$where進行JavaScript評估。這需要一個JavaScript函數表達式,需要同樣返回一個truefalse值。在外殼可以速記是這樣的:

db.collection.find(function() { 
    return (this.lastUpdate.valueOf() - this.createdDate.valueOf()) 
     > (1000 * 60 * 60 * 24); 
}) 

同樣的事情,不同的是JavaScript的評價;要求解釋,並會跑的比.aggregate()相當於慢得多。同樣,這種類型的表達式不能使用索引來優化性能。

對於最佳結果,將差異存儲在文檔中。然後,您可以直接在該屬性上直接進行查詢,當然您也可以對其進行索引。

+0

感謝您的詳細解答!作爲來自SQL的人,我沒有想到它會是那麼冗長...... – zaphod1984