2013-09-29 2 views
0

유성에 작은 프로그램을 작성하고 Heroku에서 실행되는 MongoHQ를 사용했습니다. 이 간단한 응용 프로그램은 얼마나 많은 사람들이 전자 메일을 제출했는지 라이브 카운트를 생성합니다. 당신은 여기에서 예를 찾을 수 있습니다 클라이언트 측에이메일을 Meteor 및 MongoDB에 전송하십시오.

Counts = new Meteor.Collection("supporters"); 

, 내가 실행 : DearJJAbrams 여기 컬렉션입니다

Template.CountWrapper.SupporterCount = function() { 
    return Counts.find().count(); 
}; 

Template.BodySupporter.events({ 
    'click .support-click' : function() { 
     if ($("#supportInputName").val() != "") { 
     Supporters.insert({name: $("#supportInputName").val()}); 
     $(".signup-form").fadeOut(600, function() { 
      $(".thank-you-message").fadeIn(600); 
     }); 
     } 
     return false; 
    } 
}) 

문제이다 사용자의 수가 이메일을 제출할 때 포함하는 것이의 데이터베이스가 카운트 쿼리를 매우 느리게 수행하는 것으로 보입니다. 이것을 처리하는 더 좋은 방법이 있습니까? 감사합니다.

답변

1

원시 DDP 소켓을 살펴보면 전체 컬렉션을 클라이언트로 보냈 음을 보여 주므로 전체 사용자는 전체 '지지자'컬렉션을 다운로드합니다.

이것은 비효율적 인 것처럼 보입니다. 이것은 전체 콜렉션 (~ 7000 레코드 - 각각 DDP 와이어에서 ~ 100 바이트로 보임)을 다운로드하고 다운로드 할 데이터가 거의 1MB에 이르기 때문입니다.

이렇게 다운로드해야하기 때문에 카운트를 표시 할 수 있습니다. 왜 수를 별도의 컬렉션에 저장하고 보내면 좋을까요? 그렇게 빨리해야합니다. 테이블이나 다른 곳에서 이름의 전체 목록을 제공하지 않는 한이 작업을하는 것이 더 나을 수도 있습니다.

다른 점은 웹 소켓 작동을 허용하지 않는 호스팅 제공 업체에서 유성이 XHR (long-polling)로 떨어지는 것입니다.이 추가 오버 헤드가 있기 때문에 처음에는 연결 속도가 약간 느립니다. 보통 웹 서버 요청을 처리하도록 구성되지 않은 프록시 나 방화벽과 같은 중간에있는 것을 볼 수 있습니다.

+0

이 방법을 구현하면 매우 비효율적이라는 데 전적으로 동의합니다. 카운트 번호를 저장하는 또 다른 컬렉션을 만들려고했지만 클라이언트 사이트 [meteor update] (http://docs.meteor.com/#update)에서 Meteor의 update() 기능을 사용할 수 없습니다. 방금 신뢰할 수없는 코드가 있습니다 ... 서버 측에서 구현하는 것에 대한 제안 사항이 있습니까? pulish()와 같은 메소드를 사용하거나 가입하여 서버에서이 업데이트를 얻을 수 있습니까? –

+0

신뢰할 수없는 코드 오류는 허용/거부 규칙을 추가해야하며 두 번째로 (클라이언트에서 실행하는 경우) 업데이트하기 위해'_id' 필드를 사용한다는 것을 의미합니다. 지지자 컬렉션의'insert'와'remove''.allow' /'.deny' 규칙을 사용하여 새 레코드를 추가하면 자동으로 카운터가 증가합니다. – Akshat

+0

Akshak, 다른 컬렉션을 구현했습니다. 카운터 전용. 그러나 Supporter 전체 컬렉션은 여전히 ​​클라이언트 측에 다운로드 중입니다. 이제 누군가가 이메일을 입력 필드에 입력했을 때 insert()를 옮기려고합니다. 어쨌든 전체 컬렉션을 다운로드하지 않고 컬렉션에 insert()를 호출 할 수 있습니까? –