MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak obliczyć różnicę między wartościami różnych dokumentów za pomocą agregacji mongo?

W zasadzie trudne pytanie, ale pozostanę przy uproszczonym przypadku, w którym przedstawiasz dwa dokumenty i na tym opieram rozwiązanie. Koncepcje powinny być abstrakcyjne, ale trudniejsze w przypadku rozszerzonych przypadków. Jest to możliwe dzięki struktury agregacji ogólnie:

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

Prawdopodobnie przesadzone, nie jestem pewien intencji, ale wynik tego na podstawie próbki będzie następujący:

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

Który pasuje do obliczeń.

Możesz dostosować się do swojego przypadku, ale ogólna zasada jest taka, jak pokazano.

Ostatni etap „potoku” jest trochę „ekstremalny”, ponieważ wszystko, co się robi, to połączenie wyników w jeden dokument. W przeciwnym razie wyniki „X” i „Y” są już uzyskiwane w dwóch dokumenty w przygotowaniu. Głównie przez $group operacja z $first i $last operacje, aby znaleźć odpowiednie elementy na granicy grupowania.

Kolejne operacje w $project jako etap potoku wykonuje wymaganą matematykę w celu określenia odrębnych wyników. Zobacz operatory agregacji aby uzyskać więcej informacji, w szczególności $divide i $subtract .

Cokolwiek robisz, podążasz tym kursem. Uzyskaj parę "start" i "end" na swoich dwóch klawiszach. Następnie wykonaj obliczenia.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dlaczego MongoDB nie aktualizuje się, chyba że wywołam .then res.json(...) po findOneAndUpdate?

  2. docker-compose, aby uruchomić django z mongodb

  3. res.redirect pokazuje stare informacje po przesłaniu formularza?

  4. MongoDB - usuń znaki nienumeryczne w polu

  5. Wyszukiwanie rozmyte w Mongodb?