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

Как работи примерът за броя на съобщенията в документите на Meteor?

Благодаря, че ме подтикнахте да напиша по-ясно обяснение. Ето един по-пълен пример с моите коментари. Имаше няколко грешки и несъответствия, които почистих. Следващата версия на документи ще използва това.

Meteor.publish е доста гъвкав. Не се ограничава до публикуването на съществуващи колекции MongoDB на клиента:можем да публикуваме всичко, което пожелаем. По-конкретно, Meteor.publish дефинира набор от документи за които клиентът може да се абонира. Всеки документ принадлежи на някакво име на колекция (низ), има уникален _id поле и след това има някакъв набор от JSON атрибути. Тъй като документите в набора се променят, сървърът ще изпрати промените до всеки абониран клиент, като поддържа клиента актуален.

Тук ще дефинираме набор от документи, наречен "counts-by-room" , който съдържа един документ в колекция с име "counts" . Документът ще има две полета:roomId с идентификатора на стая и count :общият брой съобщения в тази стая. Няма истинска колекция MongoDB с име counts . Това е само името на колекцията, която нашия Meteor сървър ще изпраща надолу до клиента и ще съхранява в от страна на клиента колекция с име counts .

За да направи това, нашата функция за публикуване приема roomId параметър, който ще дойде от клиента, и наблюдава заявка за всички съобщения (дефинирани другаде) в тази стая. Можем да използваме по-ефективния observeChanges форма на наблюдение на заявка тук, тъй като няма да се нуждаем от пълния документ, а само от знанието, че е добавен или премахнат нов. Всеки път, когато се добави ново съобщение с roomId ние се интересуваме, нашето обратно извикване увеличава вътрешния брой и след това публикува нов документ на клиента с тази актуализирана обща сума. И когато съобщението бъде премахнато, то намалява броя и изпраща на клиента актуализацията.

Когато за първи път извикаме observeChanges , известен брой added обратните извиквания ще се изпълняват веднага за всяко съобщение, което вече съществува. Тогава бъдещите промени ще се задействат всеки път, когато се добавят или премахват съобщения.

Нашата функция за публикуване също регистрира onStop манипулатор за почистване, когато клиентът се отпише (ръчно или при прекъсване на връзката). Този манипулатор премахва атрибутите от клиента и разрушава изпълнявания observeChanges .

Функция за публикуване се изпълнява всеки път, когато нов клиент се абонира за "counts-by-room" , така че всеки клиент ще има observeChanges работи от негово име.

// 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();
  });
});

Сега, на клиента, можем да третираме това точно като типичен абонамент за Meteor. Първо, имаме нужда от Mongo.Collection който ще съдържа нашия документ за изчислени бройки. Тъй като сървърът публикува в колекция с име "counts" , предаваме "counts" като аргумент на Mongo.Collection конструктор.

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

Тогава можем да се абонираме. (Всъщност можете да се абонирате, преди да декларирате колекцията:Meteor ще постави на опашка входящите актуализации, докато има къде да ги поставите.) Името на абонамента е "counts-by-room" , и отнема един аргумент:идентификаторът на текущата стая. Увих това в Deps.autorun така че като Session.get('roomId') промени, клиентът автоматично ще се отпише от броя на старата стая и ще се абонира отново за броя на новата стая.

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

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

// 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. Внедряване на пагинация с MongoDB, Express.js и Slush

  2. Как да предадете ObjectId от MongoDB в MVC.net

  3. Node.js - изчакайте няколко асинхронни повиквания

  4. Запитване на MongoDB за съвпадение в първия елемент в масива

  5. Как най-добре да създадете RESTful API в Node.js