Ihr Fehler besteht darin, wie Sie _id
berechnen für $group
-Operator, insbesondere sein second
Teil:
second: { $subtract: [
{ $second: "$time" },
{ $mod: [
{ $second: "$time" },
timeBlock / 1000
]}
]}
Anstatt also alle Ihre Daten in 10 timeBlock
aufzuteilen Millisekunden lange Blöcke beginnend mit new Date(end - 10 * timeBlock)
, teilen Sie es in 11 Teile auf, beginnend beim nächsten Teiler von timeBlock
.
Um dies zu beheben, sollten Sie zuerst delta = end - $time
berechnen und verwenden Sie es dann anstelle des ursprünglichen $time
um Ihre _id
zu erstellen .
Hier ist ein Beispiel dafür, was ich meine:
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) {
// ...
})
Ich empfehle Ihnen auch, rohe Zeitwerte (in Millisekunden) zu verwenden, da dies viel einfacher ist und Sie Fehler vermeiden. Sie könnten time
wirken in timeParts
nach $group
mit $project
Betreiber.