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

Come calcolare la differenza tra valori di documenti diversi utilizzando l'aggregazione mongo?

Domanda difficile in linea di principio, ma rimarrò con il caso semplificato che presenti di due documenti e baserò una soluzione su questo. I concetti dovrebbero essere astratti, ma sono più difficili per i casi estesi. Possibile con il framework di aggregazione in generale:

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

Forse esagerato, non sono sicuro dell'intento, ma l'output di questo basato sul campione sarebbe:

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

Che corrisponde ai calcoli.

Puoi adattarti al tuo caso, ma il principio generale è quello mostrato.

L'ultima fase della "conduttura" è un po' "estrema" poiché tutto ciò che viene fatto è combinare i risultati in un unico documento. In caso contrario, i risultati "X" e "Y" sono già ottenuti in due documenti in cantiere. Principalmente dal $group operazione con $first e $last operazioni per trovare i rispettivi elementi sul confine di raggruppamento.

Le successive operazioni in $project come una fase della pipeline esegue la matematica richiesta per determinare i risultati distinti. Consulta gli operatori di aggregazione per maggiori dettagli, in particolare $divide e $subtract .

Qualunque cosa tu faccia, segui questo corso. Ottieni una coppia "inizio" e "fine" sulle tue due chiavi. Quindi esegui i calcoli.