エラーは、_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
を使用する オペレーター。