如果我有文檔保存在我的MongoDB以下模式:的MongoDB:查詢兩個日期字段
{
createdDate: Date,
lastUpdate: Date
}
是可以查詢的文件,其中的時間創作和之間的週期最後更新是例如大於一天?
如果我有文檔保存在我的MongoDB以下模式:的MongoDB:查詢兩個日期字段
{
createdDate: Date,
lastUpdate: Date
}
是可以查詢的文件,其中的時間創作和之間的週期最後更新是例如大於一天?
最好的選擇是使用$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函數表達式,需要同樣返回一個true
或false
值。在外殼可以速記是這樣的:
db.collection.find(function() {
return (this.lastUpdate.valueOf() - this.createdDate.valueOf())
> (1000 * 60 * 60 * 24);
})
同樣的事情,不同的是JavaScript的評價;要求解釋,並會跑的比.aggregate()
相當於慢得多。同樣,這種類型的表達式不能使用索引來優化性能。
對於最佳結果,將差異存儲在文檔中。然後,您可以直接在該屬性上直接進行查詢,當然您也可以對其進行索引。
您可以使用$expr(3.6 mongo版本運算符)在常規查詢中使用聚合函數。
比較query operators
vs aggregation comparison operators
。
db.col.find({$expr:{$gt:[{"$subtract":["$lastUpdate","$createdDate"]},1000*60*60*24]}})
感謝您的詳細解答!作爲來自SQL的人,我沒有想到它會是那麼冗長...... – zaphod1984