MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да изчислим разликата между стойностите на различни документи с помощта на агрегиране на mongo?

Труден въпрос по принцип, но ще остана с опростения случай, който представяте от два документа, и ще базирам решение на това. Понятията трябва да са абстрактни, но са по-трудни за разширени случаи. Възможно с рамката за агрегиране като цяло:

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

Вероятно преувеличено, не съм сигурен в намерението, но резултатът от това въз основа на извадката ще бъде:

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

Което отговаря на изчисленията.

Можете да се адаптирате към вашия случай, но общият принцип е както е показано.

Последният етап на "тръбопровод" там е малко "екстремен", тъй като всичко, което се прави, е комбинирането на резултатите в един документ. В противен случай резултатите "X" и "Y" вече са получени вдве документи в процес на подготовка. Предимно от $group операция с $first и $last операции за намиране на съответните елементи на границата на групиране.

Последващите операции в $project като етап на тръбопровод изпълнява необходимите математически изчисления, за да определи отделните резултати. Вижте операторите за агрегиране за повече подробности, по-специално $divide и $subtract .

Каквото и да правите, следвате този курс. Вземете двойка "начало" и "край" на вашите два ключа. След това извършете изчисленията.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Spring Data Mongo - Как да получа вложения различен масив за вложена стойност?

  2. Как да стартирате множество приложения с един mongodb с помощта на docker

  3. Идеално ли е MongoDB да използва 150 MB памет?

  4. MongoDB с CSV данни

  5. Как да добавите индекси в проект mongoDB с рамка Morphia