2014-11-20 3 views
1

사용자가 닉네임을 설정할 수있는 대화방 앱을 만들고 있지만 닉네임은 채팅룸에 고유해야한다고 가정합니다. 이 투박한 느낌Meteor의 원자 적 조작을위한 복잡한 업데이트 선택자 사용하기

Meteor.methods({ 
    setNickname: function(nickname) { 
    check(nickname, String); 

    if (! this.userId) { /* throw error */ } 

    var chatroom = Chatroom.collection.findOne({ 
     'users._id': this.userId 
    }); 

    if (_.findWhere(chatroom.users, { nickname: nickname })) { /* throw error */ } 

    Chatroom.collection.update({ 
     'users._id': this.userId, 
    }, { 
     $set: { 
     'users.$.nickname': nickname 
     } 
    }); 
    } 
}); 

및 유효성 검사 로직이 같은 쿼리와 별과 동시성 문제가있을 수 있는지 궁금하네요 :이 같은 방법 뭔가이 구현했습니다. 나는 내가 좋아하는 뭔가 쿼리 자체에이 논리를 이동할 수 있다고 생각했다 :

Meteor.methods({ 
    setNickname: function(nickname) { 
    check(nickname, String); 

    if (! this.userId) { /* throw error */ } 

    Chatroom.collection.update({ 
     'users._id': this.userId, 
     'users.nickname': { 
     $ne: nickname 
     } 
    }, { 
     $set: { 
     'users.$.nickname': nickname 
     } 
    }); 
    } 
}); 

내가 MongoDB를 상당히 새로운 해요, 그래서 더있는 방법 확실하지 않다. 두 방법 모두 똑같이 작동하는 것처럼 보이지만 두 명의 사용자가 같은 닉네임을 동시에 설정하려고하면 첫 번째 방법으로 동일한 닉네임을 허용 할 수 있습니다.

기본적으로 복잡한 업데이트 선택기를 사용하여 이러한 연산이 원자 적이어야하는지 확인해야합니까?

답변

1

한 가지 방법은 닉네임과 chatroom ID 모두에서 mongodb에 고유 색인을 설정하는 것입니다. 그러면 해당 색인을 위반하는 삽입이나 업데이트를 방지 할 수 있습니다. 현재 존재하는 닉네임을 삽입하려고하면 콜백의 오류를 포착해야합니다.

http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

+0

여기에 MongoDB를 워드 프로세서에 다른 페이지에서 인용의 "고유 제약 조건 컬렉션에 문서를 분리하기 위해 적용 즉, 고유 인덱스는 인덱스 키에 대해 같은 값을 갖는에서 별도의 문서를 방지한다. 그러나 색인은 색인 된 배열에있는 여러 요소 또는 임베디드 된 문서가 동일한 값을 가지지 못하게합니다. " 그래서 chatroom 문서의 임베디드 배열 요소로 사용자 멤버십을 비정규 화하는 것이므로 고유 인덱스가 작동하지 않는다는 것을 의미하지 않을까요? – sbking

+0

채팅방 당 하나의 문서가 있다는 것을 의미합니까? 스키마 예제로 질문을 업데이트 할 수 있습니까? –

관련 문제