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

Kueri Agregasi Rata-rata di Meteor

Pada Meteor 0.6.5, API koleksi belum mendukung kueri agregasi karena tidak ada cara (langsung) untuk melakukan pembaruan langsung pada mereka. Namun, Anda tetap dapat menulisnya sendiri, dan membuatnya tersedia di Meteor.publish , meskipun hasilnya akan statis. Menurut pendapat saya, melakukannya dengan cara ini masih lebih disukai karena Anda dapat menggabungkan beberapa agregasi dan menggunakan API pengumpulan sisi klien.

Meteor.publish("someAggregation", function (args) {
    var sub = this;
    // This works for Meteor 0.6.5
    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    // Your arguments to Mongo's aggregation. Make these however you want.
    var pipeline = [
        { $match: doSomethingWith(args) },
        { $group: {
            _id: whatWeAreGroupingWith(args),
            count: { $sum: 1 }
        }}
    ];

    db.collection("server_collection_name").aggregate(        
        pipeline,
        // Need to wrap the callback so it gets called in a Fiber.
        Meteor.bindEnvironment(
            function(err, result) {
                // Add each of the results to the subscription.
                _.each(result, function(e) {
                    // Generate a random disposable id for aggregated documents
                    sub.added("client_collection_name", Random.id(), {
                        key: e._id.somethingOfInterest,                        
                        count: e.count
                    });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );
});

Di atas adalah contoh pengelompokan/jumlah agregasi. Beberapa hal yang perlu diperhatikan:

  • Saat Anda melakukan ini, Anda secara alami akan melakukan agregasi pada server_collection_name dan mendorong hasilnya ke koleksi lain yang disebut client_collection_name .
  • Langganan ini tidak akan ditayangkan, dan mungkin akan diperbarui setiap kali argumen berubah, jadi kami menggunakan loop yang sangat sederhana yang hanya mendorong semua hasil.
  • Hasil agregasi tidak memiliki ObjectIDs Mongo, jadi kami membuat beberapa yang arbitrer sendiri.
  • Panggilan balik ke agregasi harus dibungkus dengan Fiber. Saya menggunakan Meteor.bindEnvironment di sini tetapi seseorang juga dapat menggunakan Future untuk kontrol tingkat rendah lainnya.

Jika Anda mulai menggabungkan hasil publikasi seperti ini, Anda harus mempertimbangkan dengan cermat bagaimana id yang dibuat secara acak memengaruhi kotak gabungan. Namun, implementasi langsung dari ini hanyalah kueri basis data standar, kecuali lebih nyaman digunakan dengan sisi klien Meteor API.

TL;versi DR :Hampir setiap kali Anda mendorong data keluar dari server, sebuah publish lebih disukai daripada method .

Untuk informasi selengkapnya tentang berbagai cara melakukan agregasi, lihat pos ini .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Konstruksi Kueri MongoDb C# GeoNear

  2. Bagaimana Trello menyimpan data di MongoDB? (Koleksi per papan?)

  3. Kembalikan sejumlah catatan terbatas dari jenis tertentu, tetapi jumlah catatan lain yang tidak terbatas?

  4. Hitung rata-rata bidang dalam dokumen/array yang disematkan

  5. MongoDB Temukan kinerja:indeks gabungan tunggal VS dua indeks bidang tunggal