Un approccio consiste nell'utilizzare il framework di aggregazione
, in particolare il $redact
operatore che elimina il contenuto del flusso di documenti in base ai valori all'interno del documento e dei suoi documenti secondari. A seconda del risultato di un'espressione booleana, un documento può essere eliminato dallo stream, essere incluso nello stream dopo che anche i suoi documenti secondari sono stati controllati o semplicemente passato allo stream completo. L'idea alla base di $redact
è rendere facile la rimozione di informazioni sensibili dallo stream.
Nel tuo caso, l'espressione dei criteri utilizza $cond
operatore e $and
operatore booleano per esprimere l'AND logico tra gli intervalli di tempo con gli operatori di confronto $gt
e $lt
. Usa $hour
date per restituire l'ora per la date
campo come un numero compreso tra 0 e 23. Quindi la tua aggregazione finale è simile a questa:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Risultato di esempio:
/* 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
}