sql >> Databáze >  >> NoSQL >> MongoDB

Jak vypočítat rozdíl mezi hodnotami různých dokumentů pomocí mongo agregace?

V zásadě těžká otázka, ale zůstanu u zjednodušeného případu dvou dokumentů, který předkládáte, a založím na tom řešení. Pojmy by měly být abstraktní, ale pro rozšířené případy jsou obtížnější. Možné s rámcem agregace obecně:

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

Možná přehnané, nejsem si jistý záměrem, ale výsledek na základě vzorku by byl:

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

Což odpovídá výpočtům.

Můžete se přizpůsobit vašemu případu, ale obecný princip je takový, jak je uvedeno.

Poslední „potrubní“ fáze je trochu „extrémní“, protože vše, co se dělá, je spojit výsledky do jednoho dokumentu. Jinak jsou výsledky „X“ a „Y“ již získány ve dvou dokumenty v procesu. Většinou od $group operace s $first a $last operace k nalezení příslušných prvků na hranici seskupení.

Následné operace v $project jako fáze potrubí provádí požadovanou matematiku k určení odlišných výsledků. Viz operátory agregace další podrobnosti, zejména $divide a $subtract .

Ať děláte cokoli, dodržujte tento kurz. Získejte „start“ a „end“ pár na svých dvou klíčích. Poté proveďte výpočty.




  1. Element 'id' neodpovídá žádnému poli nebo vlastnosti chyby s vnořenými třídami

  2. Dotazování uvnitř polí Postgres JSON

  3. Oprava chyb stránky v MongoDB

  4. mongodb c# API V2:Rozdíl mezi ReplaceOne a FindOneAndReplace