Един подход е да използвате рамката за агрегиране
, по-специално $redact
оператор, който премахва потока на документа от съдържание въз основа на стойности в документа и неговите поддокументи. В зависимост от резултата от булев израз, документ може да бъде премахнат от потока, да бъде включен в потока, след като неговите поддокументи също са били проверени, или просто да бъде предаден изцяло в потока. Идеята зад $redact
е да направи премахването на чувствителна информация от потока лесно.
Във вашия случай критерийният израз използва $cond
оператор и $andкод>
булев оператор за изразяване на логическо И между времевите диапазони с операторите за сравнение $gt
и $lt
. Използвайте $hourкод>
оператор за дата, за да върне часа за датата
поле като число между 0 и 23. Така окончателното ви обобщаване изглежда така:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Примерен резултат:
/* 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
}