Pilihan terbaik adalah menggunakan $redact
tahap pipa agregasi:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Jadi Anda melihat nilai milidetik dari perbedaan yang lebih besar dari nilai milidetik untuk satu hari. $subtract
menghitung selisihnya, dan ketika dua tanggal dikurangi selisihnya dalam milidetik akan dikembalikan.
$redact
operator mengambil ekspresi logika sebagai "jika", dan di mana kondisinya true
dibutuhkan tindakan dalam "lalu" yaitu ke $$KEEP
dokumen. Dimana false
kemudian dokumen dihapus dari hasil dengan $$PRUNE
.
Perhatikan bahwa karena ini adalah kondisi logis dan bukan nilai yang ditetapkan atau rentang nilai, maka "indeks" tidak digunakan.
Karena operasi dalam pipa agregasi dikodekan secara asli, ini adalah eksekusi tercepat dari pernyataan yang bisa Anda dapatkan.
Alternatifnya adalah evaluasi JavaScript dengan $where
. Ini membutuhkan ekspresi fungsi JavaScript yang juga perlu mengembalikan true
atau false
nilai. Di shell Anda dapat menyingkat seperti ini:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Hal yang sama, kecuali bahwa evaluasi JavaScript memerlukan interpretasi dan akan berjalan jauh lebih lambat daripada .aggregate()
setara. Dengan cara yang sama, jenis ekspresi ini tidak dapat menggunakan indeks untuk mengoptimalkan kinerja.
Untuk terbaik hasil, menyimpan perbedaan dalam dokumen. Kemudian Anda cukup menanyakan langsung pada properti itu, dan tentu saja Anda juga dapat mengindeksnya.