sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur beräknar man skillnaden mellan värden för olika dokument med mongo-aggregation?

Svår fråga i princip, men jag stannar vid det förenklade fallet du presenterar av två dokument och baserar en lösning kring det. Begreppen ska abstrakta, men är svårare för utökade fall. Möjligt med aggregationsramverket i allmänhet:

db.collection.aggregate([
    // Match the documents in a pair
    { "$match": {
        "timeMilliSec": { "$in": [ 1414590255, 1414590245 ] }
    }}

    // Trivial, just keeping an order
    { "$sort": { "timeMilliSec": -1 } },

    // Unwind the arrays
    { "$unwind": "$data" },

    // Group first and last
    { "$group": {
        "_id": "$data.name",
        "firstX": { "$first": "$data.x" },
        "lastX": { "$last": "$data.x" },
        "firstY": { "$first": "$data.y" },
        "lastY": { "$last": "$data.y" }
    }},

    // Difference on the keys
    { "$project": {
        "diff": {
            "$divide": [
                { "$subtract": [ "$firstX", "$lastX" ] },
                { "$subtract": [ "$firstY", "$lastY" ] }
            ]
        }
    }},

    // Not sure you want to take it this far
    { "$group": {
        "_id": null,
        "diffX": { 
            "$min": {
                "$cond": [
                     { "$eq": [ "$_id", "X" ] },
                     "$diff",
                     false
                 ]
            }
        },
        "diffY": { 
            "$min": {
                "$cond": [
                     { "$eq": [ "$_id", "Y" ] },
                     "$diff",
                     false
                 ]
            }
        }
    }}
])

Möjligen överdrivet, inte säker på avsikten, men resultatet av detta baserat på provet skulle vara:

{ 
    "_id" : null, 
    "diffX" : 0.14285714285714285, 
    "diffY" : 0.6 
}

Vilket stämmer med beräkningarna.

Du kan anpassa dig efter ditt fall, men den allmänna principen är som visas.

Det sista "pipeline"-steget där är lite "extremt" eftersom allt som görs är att kombinera resultaten till ett enda dokument. Annars erhålls "X"- och "Y"-resultaten redan i två dokument i pipelinen. Mestadels av $group operation med $first och $last operationer för att hitta respektive element på grupperingsgränsen.

De efterföljande operationerna i $project som ett pipelinesteg utför den nödvändiga matematiken för att bestämma de distinkta resultaten. Se aggregationsoperatorerna för mer information, särskilt $divide och $subtract .

Vad du än gör följer du denna kurs. Få ett "start" och "slut" par på dina två nycklar. Utför sedan beräkningarna.




  1. expire redis cache-nyckel vid vissa timmar snarare än varaktighet

  2. mongodb - Hitta dokument med närmaste heltalsvärde

  3. Databasövervakning med ClusterControl

  4. Hur exakt matchar hela dokumentet?