Uw fout is hoe u _id
berekent voor $group
operator, met name de second
deel:
second: { $subtract: [
{ $second: "$time" },
{ $mod: [
{ $second: "$time" },
timeBlock / 1000
]}
]}
Dus, in plaats van al uw gegevens te splitsen in 10 timeBlock
milliseconden lange chunks vanaf new Date(end - 10 * timeBlock)
, je splitst het in 11 brokken vanaf de dichtstbijzijnde deler van timeBlock
.
Om het op te lossen moet je eerst delta = end - $time
calculate berekenen en gebruik het dan in plaats van de originele $time
om uw _id
te bouwen .
Hier is een voorbeeld van wat ik bedoel:
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) {
// ...
})
Ik raad je ook aan om onbewerkte tijdwaarden te gebruiken (in milliseconden), omdat het veel gemakkelijker is en omdat het je ervan weerhoudt een fout te maken. Je zou time
kunnen casten in timeParts
na $group
met behulp van $project
telefoniste.