Jednym z podejść jest użycie struktury agregacji
, w szczególności $redact
operator, który usuwa strumień treści z dokumentu na podstawie wartości w dokumencie i jego dokumentach podrzędnych. W zależności od wyniku wyrażenia logicznego dokument może zostać usunięty ze strumienia, włączony do strumienia po sprawdzeniu jego dokumentów podrzędnych lub po prostu przekazany w całości do strumienia. Idea stojąca za $redact
jest ułatwienie usuwania poufnych informacji ze strumienia.
W Twoim przypadku wyrażenie kryteriów używa $cond
operator i $and
operator logiczny do wyrażenia logicznego AND między zakresami czasu z operatorami porównania $gt
i $lt
. Użyj $hour
operator daty zwraca godzinę dla daty
pole jako liczbę z zakresu od 0 do 23. Tak więc Twoja końcowa agregacja wygląda tak:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Przykładowe wyjście:
/* 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
}