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

Ambil daftar item dengan memeriksa beberapa nilai atribut di MongoDB di golang

Anda harus menggunakan kerangka kerja agregasi tempat Anda akan menjalankan saluran agregasi yang pertama-tama memfilter dokumen dalam koleksi berdasarkan venueList id menggunakan $match operator.

Pipa kedua akan memerlukan perataan venueList dan sum array subdocument agar data dalam dokumen diproses lebih lanjut ke pipa sebagai entri yang didenormalisasi. $unwind operator berguna di sini.

Filter lebih lanjut menggunakan $match diperlukan setelah melepas sehingga hanya dokumen yang ingin Anda gabungkan yang diizinkan masuk ke pipeline berikutnya.

Pipeline utama adalah $group tahap operator yang menggabungkan dokumen yang difilter untuk membuat jumlah yang diinginkan menggunakan operator akumulator $sum . Untuk hasil yang diinginkan, Anda perlu menggunakan operator tenary seperti $cond untuk membuat bidang penghitungan independen karena itu akan memasukkan jumlah dokumen ke $sum ekspresi tergantung pada nilai nama.

Secara keseluruhan, pertimbangkan untuk menjalankan pipeline berikut:

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    {
        "$group": {
            "_id": null,
            "linux": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "linux" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            },
            "ubuntu": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "ubuntu" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            }
        }
    }
])

Untuk penggunaan dengan mGo, Anda dapat mengonversi saluran di atas menggunakan panduan di http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Untuk alternatif yang lebih fleksibel dan berkinerja lebih baik yang dieksekusi jauh lebih cepat daripada yang di atas, dan juga mempertimbangkan nilai yang tidak diketahui untuk daftar jumlah, jalankan jalur alternatif sebagai berikut

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    { 
        "$group": {
            "_id": "$venueList.sum.name",
            "count": { "$sum": "$venueList.sum.value" }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "name": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Menghitung berapa banyak dari setiap nilai berbeda yang ada?

  2. luwak unik:benar tidak berfungsi

  3. Ukuran Dokumen Array Proyek MongoDB dengan Kondisi

  4. Apa cara yang tepat untuk mengatur set replika mongodb menggunakan buruh pelabuhan dan ara?

  5. Luwak - indeks 2dsphere - howto