사용자가 닉네임을 설정할 수있는 대화방 앱을 만들고 있지만 닉네임은 채팅룸에 고유해야한다고 가정합니다. 이 투박한 느낌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를 상당히 새로운 해요, 그래서 더있는 방법 확실하지 않다. 두 방법 모두 똑같이 작동하는 것처럼 보이지만 두 명의 사용자가 같은 닉네임을 동시에 설정하려고하면 첫 번째 방법으로 동일한 닉네임을 허용 할 수 있습니다.
기본적으로 복잡한 업데이트 선택기를 사용하여 이러한 연산이 원자 적이어야하는지 확인해야합니까?
여기에 MongoDB를 워드 프로세서에 다른 페이지에서 인용의 "고유 제약 조건 컬렉션에 문서를 분리하기 위해 적용 즉, 고유 인덱스는 인덱스 키에 대해 같은 값을 갖는에서 별도의 문서를 방지한다. 그러나 색인은 색인 된 배열에있는 여러 요소 또는 임베디드 된 문서가 동일한 값을 가지지 못하게합니다. " 그래서 chatroom 문서의 임베디드 배열 요소로 사용자 멤버십을 비정규 화하는 것이므로 고유 인덱스가 작동하지 않는다는 것을 의미하지 않을까요? – sbking
채팅방 당 하나의 문서가 있다는 것을 의미합니까? 스키마 예제로 질문을 업데이트 할 수 있습니까? –