Imagine it's a slow day and we have a single session during 14:00-15:00. The raw event document for this in the 'events' collection is: { // Event A "userid": "rick", "ts": ISODate('2010-10-10T14:17:00Z'), "length":95 } Running the incremental hierarchical aggregations once every hour on the hour with each map-reduce outputting into the next level of the hierarchy, we have the following collection states ( with contributing events listed above each document): [Iteration 1: lastRun=14:00, cutOff=15:00] == events == { // Event A "userid": "rick", "ts": ISODate('2010-10-10T14:17:00Z'), "length":95 } == stats.HOURLY == { // Event A _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") }, value: { ts: ISODate('2010-10-10T15:01:01Z'), total: 95, count: 1, mean: 95.0 } } So far so good! The hourly stats won't yet filter down to the 'stats.DAILY' collection as 'value.ts' is after the cutoff for this round of aggregation. Now assume we have a slow hour with no new session events. The aggregation is run once more at 16:00. [Iteration 2: lastRun=15:00:00, cutOff=16:00:00] == events == { // Event A "userid": "rick", "ts": ISODate('2010-10-10T14:17:00Z'), "length":95 } == stats.HOURLY == { // From Event A _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") }, value: { ts: ISODate('2010-10-10T15:01:01Z'), total: 95, count: 1, mean: 95.0 } }, == stats.DAILY: == { // From Event A _id: { u: "rick", d: ISODate("2010-10-10T00:00:00Z") }, value: { ts: ISODate('2010-10-10T16:01:01Z'), total: 95, count: 1, mean: 95.0 } } The previous hourly entry remains and is now aggregated to the DAILY level ( since 15:00:00 < value.ts (= 15:01:00) < 16:00:00 ). Next, it's a busy hour! Rick logs two(!) whole session events, B and C. [Iteration 3: lastRun=16:00:00, cutOff=17:00:00] == events == { // Event A "userid": "rick", "ts": ISODate('2010-10-10T14:17:00Z'), "length":95 }, { // Event B "userid": "rick", "ts": ISODate('2010-10-10T16:17:00Z'), // NEW! "length":95 }, { // Event C "userid": "rick", "ts": ISODate('2010-10-10T16:56:00Z'), // NEW! "length":95 } == stats.HOURLY == { // Event A _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") }, value: { ts: ISODate('2010-10-10T15:01:01Z'), total: 95, count: 1, mean: 95.0 } }, { // Events B, C _id: { u: "rick", d: ISODate("2010-10-10T16:00:00Z") }, value: { ts: ISODate('2010-10-10T17:01:01Z'), total: 190, count: 2, mean: 95.0 } } == stats.DAILY == { // Event A _id: { u: "rick", d: ISODate("2010-10-10T00:00:00Z") }, value: { ts: ISODate('2010-10-10T16:01:01Z'), total: 95, count: 1, mean: 95.0 } } == stats.MONTHLY == { // Event A _id: { u: "rick", d: ISODate("2010-10-01T00:00:00Z") }, value: { ts: ISODate('2010-10-10T17:01:01Z'), total: 95, count: 1, mean: 95.0 } } Still OK! The new events have been aggregated into an HOURLY summary doc, and Event A's DAILY doc has been aggregated into the MONTHLY collection. No new events are recorded before the next iteration. [Iteration 4: lastRun=17:00:00, cutOff=18:00:00] == stats.HOURLY == { // Event A _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") }, value: { ts: ISODate('2010-10-10T15:01:01Z'), total: 95, count: 1, mean: 95.0 } }, { // Events B, C _id: { u: "rick", d: ISODate("2010-10-10T16:00:00Z") }, value: { ts: ISODate('2010-10-10T17:01:01Z'), total: 190, count: 2, mean: 95.0 } } == stats.DAILY == { // Event A, B, C _id: { u: "rick", d: ISODate("2010-10-10T00:00:00Z") }, value: { ts: ISODate('2010-10-10T18:01:01Z'), total: 285, count: 3, mean: 95.0 } } == stats.MONTHLY == { // Event A _id: { u: "rick", d: ISODate("2010-10-01T00:00:00Z") }, value: { ts: ISODate('2010-10-10T17:01:01Z'), total: 95, count: 1, mean: 95.0 } } The map-reduce process has merged the new hourly documents into the existing daily document which now has an event count of three and an updated timestamp (due to out='reduce' causing the new and existing values to combine via a reduce ). This updated DAILY document timestamp is about to become problematic... [Iteration 5: lastRun=18:00:00, cutOff=19:00:00] == stats.DAILY == { // Event A, B, C _id: { u: "rick", d: ISODate("2010-10-10T00:00:00Z") }, value: { ts: ISODate('2010-10-10T18:01:01Z'), total: 285, count: 3, mean: 95.0 } } == stats.MONTHLY == { // Event A, B, C ...and A again _id: { u: "rick", d: ISODate("2010-10-01T00:00:00Z") }, value: { ts: ISODate('2010-10-10T19:01:01Z'), total: 380, count: 4, mean: 95.0 } } The monthly document has been combined with the now has an event count of 4, with just 3 contributing events, and Event A has been included twice as a side effect of using 'out='reduce''. This is incorrect!