sql >> Database >  >> NoSQL >> MongoDB

Hoe het verschil tussen waarden van verschillende documenten te berekenen met behulp van mongo-aggregatie?

In principe lastige vraag, maar ik blijf bij de vereenvoudigde casus die je presenteert van twee documenten en baseer daar een oplossing op. De concepten moeten abstract zijn, maar zijn moeilijker voor uitgebreide gevallen. Mogelijk met het aggregatieraamwerk algemeen:

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

Mogelijk overdreven, niet zeker van de bedoeling, maar de output hiervan op basis van de steekproef zou zijn:

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

Wat overeenkomt met de berekeningen.

U kunt zich aanpassen aan uw geval, maar het algemene principe is zoals weergegeven.

De laatste "pijplijn"-fase is een beetje "extreem", omdat het enige dat wordt gedaan de resultaten in één document combineert. Anders worden de resultaten "X" en "Y" al verkregen in twee documenten in de pijplijn. Meestal door de $group bewerking met $first en $last bewerkingen om de respectieve elementen op de groeperingsgrens te vinden.

De daaropvolgende bewerkingen in $project als een pijplijnfase de vereiste wiskunde uitvoert om de verschillende resultaten te bepalen. Zie de aggregatie-operators voor meer details, in het bijzonder $divide en $subtract .

Wat je ook doet, je volgt deze cursus. Krijg een "begin" en "eind" paar op uw twee sleutels. Voer vervolgens de berekeningen uit.




  1. Hoe valideer ik leden van een matrixveld?

  2. Hoe optimistische vergrendeling te gebruiken met Spring Data MongoDB?

  3. MongoDB:Verkeerde geo-query met $geoIntersect op een polygoon

  4. NodeJS/ExpressJS verzenden reactie van grote hoeveelheid gegevens in 1 stream