2013-01-22 3 views
0

MongoDB에 500 명이 넘는 페이스 북 친구들을 저장하는 데 오랜 시간이 걸리며, 그렇게 잘못하고 있다고 생각합니다.Meteor Mongodb에 데이터를 어떻게 넣어야합니까?

models.js :

Friends = new Meteor.Collection('friends'); 
Friend = { 
set : function(owner, friend) { 
    var user_id = get_user_by_uid(friend['uid']); 
    return Friends.update({uid: friend['uid'], owner: owner}, {$set:{ 
     name : friend['name'], 
     pic_square : 'https://graph.facebook.com/'+friend['uid']+'/picture?width=150&height=150', 
     pic_cover : friend['pic_cover'], 
     uid : friend['uid'], 
     likes_count : friend['likes_count'], 
     friend_count : friend['friend_count'], 
     wall_count : friend['wall_count'], 
     age : get_age(friend['birthday_date']), 
     mutual_friend_count : friend['mutual_friend_count'], 
     owner : owner, 
     user_id : user_id ? user_id['_id'] : undefined 
    }}, {upsert: true}); 
} 
} 

server.js :

// First get facebook list of friends 
friends = friends['data']['data']; 

_.each(friends, function(friend){ 
    Friend.set(user_id, friend); 
}); 

하중은 2 + 사용자와 높은 가서는 나이 걸리는 내가 삽입을하고 있어요 방법 붙여 넣기합니다 데이터베이스에 삽입 할 수 있습니다. 여기서 무엇을 바꾸어야합니까?

+0

왜 Friends.upert 대신 Friends.update를 사용하고 있습니까? – Rahul

+0

upsert이기 때문에! – gabrielhpugliese

+0

데이터를 삽입하고 속도가 향상되는지보십시오. 또한 minimogo에서는 upsert가 아직 지원되지 않습니다 (Meteor에서 mongodb의 클라이언트 측 구현) – Rahul

답변

4

내가 생각하는 두 가지 이유로 성능이 좋지 않습니다.

먼저 클라이언트에서 mongodb 성능이 아닌 minimongo 성능이 발생합니다. minimongo은 색인을 생성 할 수 없으므로 upsert은 비쌉니다. 데이터베이스 크기는 O(n^2)입니다. 데이터베이스 업데이트 직전에 if (Meteor.isSimulation) return; 문을 모델에 추가하기 만하면됩니다.

Friend.set(user_id, friend)이 일반적으로 model.js에 정의 된 메서드 호출에서 발생해야하므로 코드를 구성하는 방법을 확인하려면 몇 가지 샘플 코드를 살펴보십시오. 그런 다음 실행중인 서버와 달리 호출을 시뮬레이트하는 클라이언트로 탐지되면 탈출해야합니다.

두 번째로 키를 사용하지 않고 uidowner을 키처럼 사용하고 있습니다. 서버 시작 코드에 Friends._ensureIndex({uid:1, owner:1})을 추가하십시오.

아무 것도 작동하지 않으면 Facebook에 대한 쿼리가 어떤 방식 으로든 속도가 제한 될 수 있습니다.

비율 제한에 따른 오류 메시지에 대한 설명은 https://stackoverflow.com/a/8805436/1757994을 참조하십시오.

그들은 당신이하는 것처럼 그래프를 복사하는 것을 거의 원하지 않습니다. 그래프를 전혀 복사하지 않고 사용 기반으로 만 데이터를 가져 오는 것을 고려하는 것이 좋습니다. 어쨌든 매우 빠르게 부패하기 때문입니다.

+0

Friend.set이 메소드 호출 중에 발생 함 다른 점을 시도해 보겠습니다. BRB – gabrielhpugliese

+0

Did : (Meteor.isSimulation)이 돌아 오면 [...]'그리고 _ensureIndex를 서버의 Meteor.startup에 넣으십시오 : set (function) (owner, friend) {var user_id = get_user_by_uid (friend [ 'uid']) – gabrielhpugliese

+0

아니오, 아무 것도 지우지 않아도된다고 생각합니다. 성능 향상이 보이지 않고 각 라인마다 Facebook에 실제로 문의하면 요금이 제한되고 있습니다. 참조 : http://stackoverflow.com/a/8805436/1757994 – DoctorPangloss

관련 문제