Một cách tiếp cận là sử dụng khung tổng hợp
, cụ thể là $ redact
toán tử tách dòng tài liệu của nội dung dựa trên các giá trị trong tài liệu và các tài liệu con của nó. Tùy thuộc vào kết quả của biểu thức boolean, một tài liệu có thể được cắt bớt khỏi luồng, được đưa vào luồng sau khi các tài liệu con của nó cũng đã được kiểm tra hoặc chỉ được chuyển hoàn chỉnh vào luồng. Ý tưởng đằng sau $ redact
là giúp dễ dàng xóa thông tin nhạy cảm khỏi luồng.
Trong trường hợp của bạn, biểu thức tiêu chí sử dụng $ cond
toán tử và $ và
toán tử boolean để thể hiện logic AND giữa các phạm vi thời gian với các toán tử so sánh $ gt
và $ lt
. Sử dụng $ giờ
toán tử ngày tháng để trả lại giờ cho date
trường dưới dạng một số từ 0 đến 23. Vì vậy, tổng hợp cuối cùng của bạn trông giống như sau:
db.collection.aggregate([
{
"$redact": {
"$cond": {
"if": {
"$and": [
{ "$gt": [ {"$hour": "$date"}, 4] },
{ "$lt": [ {"$hour": "$date"}, 8] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}
}
])
Đầu ra mẫu:
/* 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
}