Có, nó là có thể. Để so sánh nhiều tài liệu, bạn cần đặt chúng trong một mảng bằng cách sử dụng $ nhóm
và chuyển null
dưới dạng _id
. Sau đó, để bắt đầu so sánh các giá trị, bạn cần một chỉ mục giống như trong vòng lặp for để bạn có thể tạo nó bằng cách sử dụng $ range
nhà điều hành.
Để xác định phân vùng, bạn cần gấp đôi $ map
. Đầu tiên sẽ trả về một mảng 0
và 1
các giá trị trong đó 1
nghĩa là ngày này bắt đầu phân vùng mới.
$map
thứ hai là hợp nhất ngày với chỉ mục phân vùng. Để nhận chỉ mục phân vùng, bạn có thể $ sum
một mảng con ( $ slice
) trong số các số không và số một.
Ví dụ:
db.col.save({ date: ISODate("2019-04-12T21:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T21:15:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T21:45:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T23:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T20:00:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T18:30:00.000Z") })
db.col.save({ date: ISODate("2019-04-12T20:10:00.000Z") })
Trong khoảng thời gian 20
phút bạn có thể chạy tổng hợp dưới đây:
db.col.aggregate([
{ $sort: { date: 1 } },
{ $group: { _id: null, dates: { $push: "$date" } } },
{
$addFields: {
partitions: {
$map: {
input: { $range: [ 0, { $size: "$dates" } ] },
as: "index",
in: {
$let: {
vars: {
current: { $arrayElemAt: [ "$dates", "$$index" ] },
prev: { $arrayElemAt: [ "$dates", { $add: [ "$$index", -1 ] } ] }
},
in: {
$cond: [
{ $or: [ { $eq: [ "$$index", 0 ] }, { $lt: [ { $subtract: [ "$$current", "$$prev" ] }, 1200000 ] } ] },
0,
1
]
}
}
}
}
}
}
},
{
$project: {
datesWithPartitions: {
$map: {
input: { $range: [ 0, { $size: "$dates" } ] },
as: "index",
in: {
date: { $arrayElemAt: [ "$dates", "$$index" ] },
partition: { $sum: { $slice: [ "$partitions", { $add: [ "$$index", 1 ] } ] } }
}
}
}
}
}
])
cái nào sẽ in:
{
"_id" : null,
"datesWithPartitions" : [
{
"date" : ISODate("2019-04-12T18:30:00Z"),
"partition" : 0
},
{
"date" : ISODate("2019-04-12T20:00:00Z"),
"partition" : 1
},
{
"date" : ISODate("2019-04-12T20:10:00Z"),
"partition" : 1
},
{
"date" : ISODate("2019-04-12T21:00:00Z"),
"partition" : 2
},
{
"date" : ISODate("2019-04-12T21:15:00Z"),
"partition" : 2
},
{
"date" : ISODate("2019-04-12T21:45:00Z"),
"partition" : 3
},
{
"date" : ISODate("2019-04-12T23:00:00Z"),
"partition" : 4
}
]
}