sql >> Database >  >> NoSQL >> MongoDB

tijdreeksen en aggregatieraamwerk (mongo)

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.




  1. Een MongoDB-datum afdrukken vanuit PHP

  2. MongoDB Toon alle inhoud van alle collecties

  3. Kan ik populate before aggregaat gebruiken in mangoest?

  4. Knooppunt voegt grote gegevens in met mangoest