Een benadering is het gebruik van het aggregatieraamwerk
, in het bijzonder de $redact
operator die de documentstroom van inhoud ontdoet op basis van waarden binnen het document en zijn subdocumenten. Afhankelijk van het resultaat van een booleaanse uitdrukking, kan een document uit de stream worden gesnoeid, in de stream worden opgenomen nadat ook de subdocumenten zijn gecontroleerd, of gewoon volledig in de stream worden doorgegeven. Het idee achter $redact
is om het verwijderen van gevoelige informatie uit de stream gemakkelijk te maken.
In jouw geval gebruikt de criteria-expressie de $cond
operator en de $and
booleaanse operator om de logische AND tussen de tijdbereiken uit te drukken met de vergelijkingsoperatoren $gt
en $lt
. Gebruik de $hour
datum operator om het uur terug te geven voor de date
veld als een getal tussen 0 en 23. Uw uiteindelijke aggregatie ziet er dus als volgt uit:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Voorbeelduitvoer:
/* 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
}