programing

유성 문서의 메시지 수 예제는 어떻게 작동합니까?

closeapi 2023. 5. 16. 22:41
반응형

유성 문서의 메시지 수 예제는 어떻게 작동합니까?

문서에서 이 예를 완전히 이해하는 데 어려움을 겪고 있습니다.여러 가지 방법으로 운영해 보았습니다. 어떻게 작동하는지 등을 관찰할 수 있었습니다.

이것을 어떻게 구독합니까?이 작업에 필요한 클라이언트 사이드 코드를 포함할 수 있습니까?

라는 이 있습니까?messages-count는 사입니다.Room메시모 ?▁can▁example?▁defin▁▁in▁the▁the▁?▁we음?컬렉션 정의를 예제에 포함할 수 있습니까?

이것에 대한 어떤 팁도 좋을 것입니다!

참고: 이 코드는 이 질문이 처음 게시되었을 때(2012년 5월) 나타난 코드입니다.이제는 더 간단합니다.

// server: publish the current size of a collection
Meteor.publish("messages-count", function (roomId) {
  var self = this;
  var uuid = Meteor.uuid();
  var count = 0;

  handle = Room.find({room_id: roomId}).observe({
    added: function (doc, idx) {
      count++;
      self.set("messages-count", uuid, "count", count);
      self.flush();
    },
    removed: function (doc, idx) {
      count--;
      self.set("messages-count", uuid, "count", count);
      self.flush();
    }
    // don't care about moved or changed
  });

  // remove data and turn off observe when client unsubs
  self.onStop(function () {
    handle.stop();
    self.unset("messages-count", uuid, "count");
    self.flush();
  });
});

좀 더 명확한 설명을 써달라고 요청해주셔서 감사합니다.여기 제 의견과 함께 더 많은 예가 있습니다.제가 정리한 몇 가지 버그와 불일치가 있었습니다.다음 문서 릴리스에서는 이 기능을 사용합니다.

Meteor.publish 매우 유연합니다.기존 MongoDB 컬렉션을 고객에게 게시하는 것에 국한되지 않습니다. 원하는 모든 것을 게시할 수 있습니다.구체적으로.Meteor.publish클라이언트가 등록할 수 있는 문서 집합을 정의합니다.각 문서는 일부 컬렉션 이름(문자열)에 속하며 고유합니다._id필드에 JSON 속성 집합이 있습니다.세트의 문서가 변경되면 서버는 변경사항을 등록된 각 클라이언트로 전송하여 클라이언트를 최신 상태로 유지합니다.

여서정의문집다같음습다니과합서은라는 하겠습니다."counts-by-room"이 " 이이지집단문들있다습니어름"인 합니다."counts"에는 두의 필드가 : a 서에는두있습다니: aroomId방아이로디, 고의리그,로,▁the▁with고그디리▁room▁and.count해당 룸의 총 메시지 수입니다.MongoDB라는 이름의 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"한 가지 주장이 필요합니다. 현재 룸의 ID입니다.제가이걸안싸요놨어에 안에 .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.");

Leonhardt Wille이 말했듯이, 이 솔루션의 단점은 Meteor가 Mongo 서버에서 전체 항목 모음을 다운로드하여 계산한다는 것입니다.gist.github.com/3925008 있는 그의 솔루션이 더 낫지만 새 항목을 삽입하면 카운터가 업데이트되지 않습니다.

여기 제 반응형 솔루션이 있습니다.

컬렉션:

Players = new Meteor.Collection("players");
PlayersCounts = new Meteor.Collection("players_counts")

서버:

Meteor.publish("players_counts", function(){
    var uuid = Meteor.uuid()
    var self = this;

    var unthrottled_setCount = function(){
        cnt = Players.find({}).count()
        self.set("players_counts", uuid, {count: cnt})
        self.flush()
    }

    var setCount = _.throttle(unthrottled_setCount, 50)

    var handle = Meteor._InvalidationCrossbar.listen({collection: "players"}, function(notification, complete){
        setCount();
        complete();
    })

    setCount();
    self.complete()
    self.flush()

    self.onStop(function(){
        handle.stop();
        self.unset("players_counts", uuid, ["count"]);
        self.flush();
    });
});

고객:

Meteor.subscribe("players_counts")

Template.leaderboard.total = function(){
    var cnt = PlayersCounts.findOne({})
    if(cnt) {
        return cnt.count;
    } else {
        return null;
    }
}

자기 자신이 있는 곳에서 문제의 해결책을 찾았습니다.flush()는 클라이언트에 수천 개의 업데이트를 보내고 있습니다. 다음을 계산할 때 _.discounce를 사용하십시오.

count = 0
throttled_subscription = _.debounce =>
  @set 'items-count', uuid, count: count
  @flush()
, 10
handle = Items.find(selector).observe
  added: =>
    count++
    throttled_subscription()
  removed: =>
    count--
    throttled_subscription()

이렇게 하면 카운트가 설정되고 변경되지 않은 10ms 후에만 구독이 플러시됩니다.

힌트를 주신 #meteor의 @possibilities 덕분입니다.

언급URL : https://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work

반응형