sql >> Databasteknik >  >> NoSQL >> MongoDB

Fråga mongo för att upptäcka värdeförändringar i tidsserier

Du måste skaffa ett par dokument i följd för att upptäcka gapet. För det kan du skjuta alla dokument till en enda array och zip det med sig självt skiftat 1 element från huvudet:

db.collection.aggregate([
    { $sort: { day: 1 } },
    { $group: { _id: null, docs: { $push: "$$ROOT" } } },
    { $project: {
        pair: { $zip: {
            inputs:[ { $concatArrays: [ [false], "$docs" ] }, "$docs" ]            
        } }
    } },
    { $unwind: "$pair" },
    { $project: {
        prev: { $arrayElemAt: [ "$pair", 0 ] },
        next: { $arrayElemAt: [ "$pair", 1 ] }
    } },
    { $match: {
         $expr: { $ne: ["$prev.value", "$next.value"] } 
    } },
    { $replaceRoot:{ newRoot: "$next" } }
])

Resten är trivialt - du kopplar av arrayen tillbaka till dokument, jämför paren, filtrerar bort de lika, och ersätt rot från det som är kvar.



  1. NoSQL (MongoDB) vs Lucene (eller Solr) som din databas

  2. Gjut vanligt föremål till mangustdokument

  3. Konvertera DBObject till en POJO med MongoDB Java Driver

  4. redis prestanda, lagra json-objekt som en sträng