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

Bagaimana cara kerja contoh penghitungan pesan di Meteor docs?

Terima kasih telah mendorong saya untuk menulis penjelasan yang lebih jelas. Berikut adalah contoh yang lebih lengkap dengan komentar saya. Ada beberapa bug dan inkonsistensi yang telah saya bersihkan. Rilis dokumen berikutnya akan menggunakan ini.

Meteor.publish cukup fleksibel. Ini tidak terbatas pada penerbitan koleksi MongoDB yang ada ke klien:kami dapat menerbitkan apa pun yang kami inginkan. Khususnya, Meteor.publish mendefinisikan set dokumen bahwa klien dapat berlangganan. Setiap dokumen milik beberapa nama koleksi (string), memiliki _id yang unik bidang, dan kemudian memiliki beberapa set atribut JSON. Saat dokumen di set berubah, server akan mengirimkan perubahan ke setiap klien berlangganan, menjaga klien tetap up to date.

Kita akan mendefinisikan kumpulan dokumen di sini, yang disebut "counts-by-room" , yang berisi satu dokumen dalam koleksi bernama "counts" . Dokumen akan memiliki dua bidang:roomId dengan ID kamar, dan count :jumlah total pesan di ruangan itu. Tidak ada koleksi MongoDB nyata bernama counts . Ini hanyalah nama koleksi yang akan dikirim oleh server Meteor kami ke klien, dan disimpan di sisi klien koleksi bernama counts .

Untuk melakukan ini, fungsi publikasi kami mengambil roomId parameter yang akan datang dari klien, dan mengamati kueri semua Pesan (didefinisikan di tempat lain) di ruangan itu. Kita dapat menggunakan observeChanges yang lebih efisien bentuk mengamati kueri di sini karena kita tidak memerlukan dokumen lengkap, hanya pengetahuan bahwa yang baru telah ditambahkan atau dihapus. Setiap kali pesan baru ditambahkan dengan roomId kami tertarik, panggilan balik kami menambah jumlah internal, dan kemudian menerbitkan dokumen baru ke klien dengan total yang diperbarui itu. Dan ketika sebuah pesan dihapus, itu akan mengurangi jumlah dan mengirimkan pembaruan kepada klien.

Saat pertama kali kita memanggil observeChanges , sejumlah added callback akan langsung dijalankan, untuk setiap pesan yang sudah ada. Kemudian perubahan di masa mendatang akan diaktifkan setiap kali pesan ditambahkan atau dihapus.

Fungsi publikasi kami juga mendaftarkan onStop handler untuk membersihkan saat klien berhenti berlangganan (baik secara manual, atau saat terputus). Handler ini menghapus atribut dari klien dan meruntuhkan observeChanges . yang sedang berjalan .

Fungsi publikasi berjalan setiap kali klien baru berlangganan "counts-by-room" , jadi setiap klien akan memiliki observeChanges berjalan atas namanya.

// server: publish the current size of a collection
Meteor.publish("counts-by-room", function (roomId) {
  var self = this;
  var count = 0;
  var initializing = true;

  var handle = Messages.find({room_id: roomId}).observeChanges({
    added: function (doc, idx) {
      count++;
      if (!initializing)
        self.changed("counts", roomId, {count: count});  // "counts" is the published collection name
    },
    removed: function (doc, idx) {
      count--;
      self.changed("counts", roomId, {count: count});  // same published collection, "counts"
    }
    // don't care about moved or changed
  });

  initializing = false;

  // publish the initial count. `observeChanges` guaranteed not to return
  // until the initial set of `added` callbacks have run, so the `count`
  // variable is up to date.
  self.added("counts", roomId, {count: count});

  // and signal that the initial document set is now available on the client
  self.ready();

  // turn off observe when client unsubscribes
  self.onStop(function () {
    handle.stop();
  });
});

Sekarang, pada klien, kami dapat memperlakukan ini seperti langganan Meteor pada umumnya. Pertama, kita membutuhkan Mongo.Collection yang akan menyimpan dokumen penghitungan terhitung kami. Karena server menerbitkan ke dalam koleksi bernama "counts" , kami melewati "counts" sebagai argumen untuk Mongo.Collection konstruktor.

// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");

Kemudian kita bisa berlangganan. (Anda sebenarnya dapat berlangganan sebelum mendeklarasikan koleksi:Meteor akan mengantrekan pembaruan yang masuk sampai ada tempat untuk meletakkannya.) Nama langganan adalah "counts-by-room" , dan dibutuhkan satu argumen:ID ruangan saat ini. Saya telah membungkus ini di dalam Deps.autorun sehingga sebagai Session.get('roomId') berubah, klien akan secara otomatis berhenti berlangganan dari jumlah kamar lama dan berlangganan kembali ke jumlah kamar baru.

// client: autosubscribe to the count for the current room
Tracker.autorun(function () {
  Meteor.subscribe("counts-by-room", Session.get("roomId"));
});

Akhirnya, kami mendapatkan dokumen di Counts dan kita dapat menggunakannya seperti koleksi Mongo lainnya di klien. Template apa pun yang mereferensikan data ini akan digambar ulang secara otomatis setiap kali server mengirimkan hitungan baru.

// client: use the new collection
console.log("Current room has " + Counts.findOne().count + " messages.");


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Penolakan janji yang tidak tertangani:Kesalahan:URL salah format, tidak dapat diuraikan

  2. layanan mongodb tidak dimulai

  3. Pembentukan Ulang Dokumen MongoDB

  4. Redis vs MongoDB

  5. Indeks MongoDB pada tipe yang berbeda