En metod är att använda aggregationsramverket
, särskilt $redact
operatör som tar bort dokumentströmmen från innehåll baserat på värden i dokumentet och dess underdokument. Beroende på resultatet av ett booleskt uttryck kan ett dokument beskäras från flödet, inkluderas i flödet efter att dess underdokument också har kontrollerats, eller bara skickas komplett till flödet. Tanken bakom $redact
är att göra det enkelt att ta bort känslig information från strömmen.
I ditt fall använder kriterieuttrycket $cond
operatorn och $and
boolesk operator för att uttrycka den logiska AND mellan tidsintervallen med jämförelseoperatorerna $gt
och $lt
. Använd $hour
datumoperator för att returnera timmen för datum
fältet som ett tal mellan 0 och 23. Din slutliga aggregering ser alltså ut så här:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Exempel på utdata:
/* 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
}