MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara menghitung perbedaan antara nilai dokumen yang berbeda menggunakan agregasi mongo?

Pertanyaan yang sulit pada prinsipnya, tetapi saya akan tetap dengan kasus sederhana yang Anda sajikan dari dua dokumen dan mendasarkan solusi di sekitar itu. Konsep harus abstrak, tetapi lebih sulit untuk kasus yang diperluas. Mungkin dengan kerangka kerja agregasi secara umum:

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

Mungkin berlebihan, tidak yakin dengan maksudnya, tetapi output dari ini berdasarkan sampel adalah:

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

Yang cocok dengan perhitungan.

Anda dapat beradaptasi dengan kasus Anda, tetapi prinsip umumnya seperti yang ditunjukkan.

Tahap “pipeline” terakhir ada yang sedikit “ekstrim” karena yang dilakukan hanyalah menggabungkan hasil menjadi satu dokumen. Jika tidak, hasil "X" dan "Y" sudah diperoleh dalam dua dokumen dalam pipa. Sebagian besar oleh $group operasi dengan $first dan $last operasi untuk menemukan masing-masing elemen pada batas pengelompokan.

Operasi selanjutnya di $project sebagai tahap pipa melakukan matematika yang diperlukan untuk menentukan hasil yang berbeda. Lihat operator agregasi untuk detail lebih lanjut, khususnya $divide dan $subtract .

Apa pun yang Anda lakukan, Anda mengikuti kursus ini. Dapatkan pasangan "mulai" dan "akhiri" pada dua kunci Anda. Kemudian lakukan perhitungan.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoError:Pengubah tidak dikenal:$pushAll di node js

  2. Cari berdasarkan elemen objek dalam array

  3. Permintaan mongoDB yang sangat lambat pada koleksi kecil dalam basis data yang sederhana namun besar

  4. Virtual Mongoose di Agregat MongoDB

  5. Kueri Agregasi Flask-MongoEngine &PyMongo