Une approche consiste à utiliser le framework d'agrégation
, en particulier le $redact
opérateur qui supprime le flux de documents du contenu en fonction des valeurs du document et de ses sous-documents. Selon le résultat d'une expression booléenne, un document peut être élagué du flux, être inclus dans le flux après que ses sous-documents ont également été vérifiés, ou simplement passé complet dans le flux. L'idée derrière $redact
est de faciliter la suppression des informations sensibles du flux.
Dans votre cas, l'expression des critères utilise le $cond
et l'opérateur $and
opérateur booléen pour exprimer le ET logique entre les plages de temps avec les opérateurs de comparaison $gt
et $lt
. Utilisez le $hour
opérateur de date pour renvoyer l'heure pour la date
champ sous la forme d'un nombre compris entre 0 et 23. Ainsi, votre agrégation finale ressemble à ceci :
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Exemple de sortie :
/* 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
}