En tilgang er at bruge aggregeringsramme
, især $redact
operatør, der fjerner dokumentstrømmen for indhold baseret på værdier i dokumentet og dets underdokumenter. Afhængigt af resultatet af et boolesk udtryk, kan et dokument beskæres fra strømmen, inkluderes i strømmen, efter at dets underdokumenter også er blevet kontrolleret, eller bare sendes komplet ind i strømmen. Idéen bag $redact
er at gøre det let at fjerne følsomme oplysninger fra streamen.
I dit tilfælde bruger kriterieudtrykket $cond
operatøren og $and
boolesk operator til at udtrykke den logiske AND mellem tidsintervallerne med sammenligningsoperatorerne $gt
og $lt
. Brug $hour
datooperatør for at returnere timen for datoen
felt som et tal mellem 0 og 23. Din endelige aggregering ser således ud:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Eksempeloutput:
/* 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
}