2012-10-04 2 views
1

MongoDB와 원자 '$ set'연산자를 사용하여 MongoDB 문서를 업데이트하는 방법을 생각해 내는데 어려움을 겪고 있습니다. 나는 그것이 Mongo의 기준/업데이트 언어 인 것으로 꽤 확신한다. 나는 Mongomatic이 아니라 문제가있다. 그러나 나는 틀린 것으로 기꺼이 증명된다.Mongo/Mongomatic에서 원자 적 업데이트를 수행하는 방법?

독립과 요점에 대한 링크, 실행 가능한 스크립트는 여기에 있습니다 : 나는이처럼 보이는 문서를 생성하여 시작하고 https://gist.github.com/3835672

:

{"videos":[{"video_id":"video1"},{"video_id":"video2"}],"_id":{"$oid": "506ddd53a114604ce3000001"}} 

내가 사용하여 해당 문서를 얻을 수 있습니다 모델은 사용 Mongomatic 인스턴스화 :

를 : 나는이 일을함으로써, '전망'필드를 설정하기 위해 노력하고있어

다음
video_group = VideoGroup.find_one('videos.video_id' => 'video1') 

몽고는 다음과 같은 오류와 함께, 불면 어디

video_group.update!({ 'videos.video_id' => 'video1' }, '$set' => { 'videos.$.views' => 123 }) 

:

can't append to array using string field name [$] 

나는이에 유래에 대한 매우 일반적인 질문 알고있다. 나는 일반적으로 문제는 위치 연산자가 일치하지 않는다는 것을 이해한다. 그러나 수십 개의 응답을 읽는 경우에도 여전히 작동하는 방식으로이 성명을 표현하는 방법을 알 수 없습니다.

방금 ​​잘못된 데이터 구조로 시작 했습니까?

+0

나는 Mongo와 Mongomatic 사이의 균열에 빠져있는 것을하려고하고있는 것처럼 보입니다. 나는 이것을 Mongo로 가서 다음과 같이 마침내 작동하게 만들었습니다 : VideoGroup.collection.update ( { 'videos.video_id'=> 'video1'}, { '$ set'=> {videos. $ .views '=> 123}} ) –

답변

1

이것은 사실상 외교 문제입니다. 기본 mongo ruby ​​드라이버에 옵션 {: multi => true}를 전달할 필요가 있으며 옵션 매개 변수의 일부가 아닌 mongodb에 전송 된 업데이트의 _id에 대한 기준을 포함해야합니다. 몽고메틱의 버그 같아. 여기에 내가 그것을 찾기 위해 사용되는 루비 디버거 성적은 다음과 같습니다

을 : 나는 라인 # 41 전에 라인 debugger을 추가하고, 여기에 라인 # 42-44을 변경, 당신이 게시 된 파일을 변경했다 https://gist.github.com/3836797

video_group.update!({ 'videos.video_id' => 'video1', :multi => true }, '$set' => { 
    'videos.$.views' => 123, 
}) 
관련 문제