sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan beregner man forskel mellem værdier af forskellige dokumenter ved hjælp af mongo-aggregering?

Svært spørgsmål i princippet, men jeg vil blive ved den forenklede sag, du fremlægger af to dokumenter, og basere en løsning på det. Begreberne burde abstrahere, men er sværere for udvidede tilfælde. Muligt med aggregeringsramme generelt:

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
                 ]
            }
        }
    }}
])

Muligvis overdrevet, ikke sikker på hensigten, men outputtet af dette baseret på prøven ville være:

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

Hvilket stemmer overens med beregningerne.

Du kan tilpasse dig din sag, men det generelle princip er som vist.

Det sidste "pipeline"-stadium der er lidt "ekstremt", da det eneste, der gøres, er at kombinere resultaterne til et enkelt dokument. Ellers er "X"- og "Y"-resultaterne allerede opnået i to dokumenter i pipelinen. Mest af $group operation med $first og $last operationer for at finde de respektive elementer på grupperingsgrænsen.

De efterfølgende operationer i $project som en pipeline fase udfører den nødvendige matematik for at bestemme de forskellige resultater. Se aggregationsoperatørerne for flere detaljer, især $divide og $subtract .

Uanset hvad du gør, følger du dette kursus. Få et "start" og "slut" par på dine to nøgler. Udfør derefter beregningerne.




  1. MongoDB gruppe og trække værdier fra forskellige dokumenter

  2. Gemmer en array-egenskab på et Mongoose-skema

  3. Forespørgsel om at konvertere et array til et kort over dokumenter med n attributter

  4. Sådan installeres MongoDB 4.2 på RedHat/CentOS 7-systemer