Salah satu pendekatannya adalah dengan menggunakan kerangka kerja agregasi
, khususnya $redact
operator yang menghapus aliran dokumen dari konten berdasarkan nilai dalam dokumen dan sub-dokumennya. Bergantung pada hasil ekspresi boolean, dokumen dapat dipangkas dari aliran, dimasukkan ke dalam aliran setelah sub-dokumennya juga diperiksa, atau baru saja lulus lengkap ke dalam aliran. Ide di balik $redact
adalah mempermudah penghapusan informasi sensitif dari aliran.
Dalam kasus Anda, ekspresi kriteria menggunakan $cond
dan $and
operator boolean untuk menyatakan logika AND antara rentang waktu dengan operator pembanding $gt
dan $lt
. Gunakan $hour
operator tanggal untuk mengembalikan jam untuk date
bidang sebagai angka antara 0 dan 23. Dengan demikian, agregasi akhir Anda terlihat seperti ini:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Contoh Keluaran:
/* 0 */
{
"result" : [
{
"_id" : ObjectId("56404450472fe25cc6b85886"),
"date" : ISODate("2015-11-09T05:58:19.474Z")
},
{
"_id" : ObjectId("56404450472fe25cc6b85887"),
"date" : ISODate("2014-10-25T07:30:00.241Z")
}
],
"ok" : 1
}