MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zeitreihen- und Aggregationsframework (Mongo)

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.