आपकी त्रुटि यह है कि आप _id
. की गणना कैसे कर रहे हैं $group
. के लिए ऑपरेटर, विशेष रूप से इसका second
भाग:
second: { $subtract: [
{ $second: "$time" },
{ $mod: [
{ $second: "$time" },
timeBlock / 1000
]}
]}
इसलिए, अपने सभी डेटा को 10 timeBlock
. में विभाजित करने के बजाय new Date(end - 10 * timeBlock)
. से शुरू होने वाले मिलीसेकंड लंबे खंड , आप इसे timeBlock
के निकटतम भाजक से प्रारंभ करते हुए 11 भागों में विभाजित कर रहे हैं ।
इसे ठीक करने के लिए आपको पहले delta = end - $time
. की गणना करनी चाहिए और फिर मूल $time
. के बजाय इसका उपयोग करें अपना _id
बनाने के लिए ।
मेरे कहने का एक उदाहरण यहां दिया गया है:
Document.aggregate({
$match: {
time: {
$gte: new Date(end - 10 * timeBlock),
$lt: new Date(end)
}
}
}, {
$project: {
time: 1,
delta: { $subtract: [
new Date(end),
"$time"
]}
}
}, {
$project: {
time: 1,
delta: { $subtract: [
"$delta",
{ $mod: [
"$delta",
timeBlock
]}
]}
}
}, {
$group: {
_id: { $subtract: [
new Date(end),
"$delta"
]},
count: { $sum: 1 }
}
}, {
$project: {
time: "$_id",
count: 1,
_id: 0
}
}, {
$sort: {
time: 1
}
}, function(err, result) {
// ...
})
मैं आपको कच्चे समय के मूल्यों (मिलीसेकंड में) का उपयोग करने की भी सलाह देता हूं, क्योंकि यह बहुत आसान है और क्योंकि यह आपको गलती करने से रोकेगा। आप time
कास्ट कर सकते हैं timeParts
. में $group
. के बाद $project
. का उपयोग करके ऑपरेटर।