हाँ यह संभव है। एकाधिक दस्तावेज़ों की तुलना करने के लिए आपको का उपयोग करके उन्हें एक सरणी में रखना होगा। $समूह
और null
passing पास करना _id
. के रूप में . फिर मूल्यों की तुलना शुरू करने के लिए आपको लूप की तरह ही एक इंडेक्स की आवश्यकता होती है ताकि आप इसे $रेंज
ऑपरेटर।
विभाजन निर्धारित करने के लिए आपको डबल $map
की आवश्यकता होगी . पहला 0
. की एक सरणी लौटाएगा और 1
मान जहां 1
इसका मतलब है कि यह तारीख नया विभाजन शुरू करती है।
दूसरा $map
विभाजन अनुक्रमणिका के साथ तिथियों को मर्ज करना है। विभाजन सूचकांक प्राप्त करने के लिए आप $sum
कर सकते हैं एक सबअरे ($slice
) शून्य और एक के।
उदाहरण के लिए:
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") })
20
. के अंतराल के लिए मिनट आप एकत्रीकरण के नीचे चला सकते हैं:
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 ] } ] } }
}
}
}
}
}
])
जो प्रिंट होगा:
{
"_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
}
]
}