Bạn cần lấy các cặp tài liệu liên tiếp để phát hiện khoảng trống. Để làm được điều đó, bạn có thể đẩy tất cả tài liệu vào một mảng duy nhất và zip nó tự dịch chuyển 1 phần tử từ phần đầu:
db.collection.aggregate([
{ $sort: { day: 1 } },
{ $group: { _id: null, docs: { $push: "$$ROOT" } } },
{ $project: {
pair: { $zip: {
inputs:[ { $concatArrays: [ [false], "$docs" ] }, "$docs" ]
} }
} },
{ $unwind: "$pair" },
{ $project: {
prev: { $arrayElemAt: [ "$pair", 0 ] },
next: { $arrayElemAt: [ "$pair", 1 ] }
} },
{ $match: {
$expr: { $ne: ["$prev.value", "$next.value"] }
} },
{ $replaceRoot:{ newRoot: "$next" } }
])
Phần còn lại là không quan trọng - bạn giải phóng mảng trở lại tài liệu, so sánh các cặp, lọc ra các cặp bằng nhau và ReplaceRoot từ những gì còn lại.