sql >> Databáze >  >> NoSQL >> MongoDB

časové řady a agregační rámec (mongo)

Vaše chyba je ve způsobu výpočtu _id pro $group operátor, konkrétně jeho second část:

second: { $subtract: [
    { $second: "$time" },
    { $mod: [
        { $second: "$time" },
        timeBlock / 1000
    ]}
]}

Takže namísto rozdělení všech dat do 10 timeBlock milisekundové části počínaje new Date(end - 10 * timeBlock) , rozdělujete jej na 11 částí počínaje nejbližším dělitelem timeBlock .

Chcete-li to opravit, měli byste nejprve vypočítat delta = end - $time a poté jej použijte místo původního $time k vytvoření vašeho _id .

Zde je příklad toho, co mám na mysli:

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) {
    // ...
})

Také vám doporučuji používat nezpracované hodnoty času (v milisekundách), protože je to mnohem jednodušší a protože vám to zabrání udělat chybu. Můžete sesílat time do timeParts po $group pomocí $project operátor.




  1. RMongo dbGetQueryForKeys(), jaká je struktura klíčů a jak je podklíčím?

  2. MongoConnectionException – Nepodařilo se připojit k:localhost:27017

  3. Chyba MongoDB Atlas při provádění transakce na více kolekcích (kód 8000)

  4. MongoDB – vztah mnoho k mnoha?