sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan fungerer eksemplet med optælling af meddelelser i Meteor-dokumenter?

Tak fordi du fik mig til at skrive en klarere forklaring. Her er et mere fyldestgørende eksempel med mine kommentarer. Der var et par fejl og uoverensstemmelser, som jeg har ryddet op i. Næste docs-udgivelse vil bruge dette.

Meteor.publish er ret fleksibel. Det er ikke begrænset til at udgive eksisterende MongoDB-samlinger til klienten:vi kan udgive alt, hvad vi vil. Specifikt Meteor.publish definerer et sæt af dokumenter som en kunde kan abonnere på. Hvert dokument tilhører et eller andet samlingsnavn (en streng), har et unikt _id felt, og har derefter et sæt JSON-attributter. Efterhånden som dokumenterne i sættet ændres, vil serveren sende ændringerne ned til hver abonnent klient og holde klienten opdateret.

Vi vil definere et dokumentsæt her, kaldet "counts-by-room" , der indeholder et enkelt dokument i en samling ved navn "counts" . Dokumentet vil have to felter:et roomId med id'et for et værelse og count :det samlede antal beskeder i det rum. Der er ingen rigtig MongoDB-samling med navnet counts . Dette er blot navnet på den samling, som vores Meteor-server sender ned til klienten og gemmer på en klientside samling med navnet counts .

For at gøre dette tager vores publiceringsfunktion et roomId parameter, der kommer fra klienten og observerer en forespørgsel på alle meddelelser (defineret andetsteds) i det rum. Vi kan bruge de mere effektive observeChanges form for at observere en forespørgsel her, da vi ikke har brug for hele dokumentet, kun viden om, at en ny blev tilføjet eller fjernet. Når som helst en ny besked tilføjes med roomId vi er interesserede i, øger vores tilbagekald det interne antal og udgiver derefter et nyt dokument til klienten med den opdaterede total. Og når en besked fjernes, nedsætter den antallet og sender opdateringen til klienten.

Når vi første gang kalder observeChanges , et antal added tilbagekald vil køre med det samme for hver besked, der allerede eksisterer. Så udløses fremtidige ændringer, hver gang meddelelser tilføjes eller fjernes.

Vores publiceringsfunktion registrerer også en onStop handler for at rydde op, når klienten afmelder sig (enten manuelt eller ved afbrydelse). Denne behandler fjerner attributterne fra klienten og river den kørende observeChanges ned .

En publiceringsfunktion kører hver gang en ny klient abonnerer på "counts-by-room" , så hver klient vil have en observeChanges kører på dens vegne.

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

Nu, på klienten, kan vi behandle dette ligesom et typisk Meteor-abonnement. Først skal vi bruge en Mongo.Collection der vil holde vores beregnede antal dokument. Da serveren udgiver i en samling ved navn "counts" , sender vi "counts" som argumentet til Mongo.Collection konstruktør.

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

Så kan vi abonnere. (Du kan faktisk abonnere, før du erklærer samlingen:Meteor sætter de indgående opdateringer i kø, indtil der er et sted at placere dem.) Navnet på abonnementet er "counts-by-room" , og det kræver et argument:det aktuelle rums ID. Jeg har pakket dette ind i Deps.autorun så som Session.get('roomId') ændringer, vil klienten automatisk afmelde det gamle lokales optælling og gentilmelde sig det nye lokales optælling.

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

Endelig har vi dokumentet i Counts og vi kan bruge det ligesom enhver anden Mongo-kollektion på klienten. Enhver skabelon, der refererer til disse data, vil automatisk tegne igen, hver gang serveren sender en ny optælling.

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


  1. MongoDB deleteMany()

  2. Hvor står mongodb i CAP-sætningen?

  3. Mongoose underdokumenter vs indlejret skema

  4. Sådan analyseres diskbrug af en Docker-container