2012-04-26 3 views
6

음악이라는 내 mongo 데이터베이스에 다음 개체가 있습니다.

나는 장르가 그런
입니다 업데이트 할 밴드 이름은 너바나
입니다 앨범 이름은 트랙 순서는 1

MongoDB 딥 배열 업데이트

트랙의 이름을 변경할 수 있습니다에 "하이틴 성령 냄새가 신경 끄시 고
입니다 ! ".
나는 위치 연산자를 사용하여 연주 해 보았지만, 실제로는 이것을 계산할 수 없습니다.

{ 
    genre : "Grunge", 
    bands : [ { 
     name : "Nirvana", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    }, 
    { 
     name : "Karma++ : A Nirvina Tribute Band", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    } ] 
} 
+0

DB 디자인을 조금 변경하셨습니까? 문서가 '장르'속성을 가진 '밴드'인 경우 더 이해할 수 있습니다.이 특정 검색어를 훨씬 쉽게 만들 수도 있습니다. – Russell

+0

이것은 내가 생각할 수있는 가장 빠른 예일뿐입니다. 실제로 '음악'데이터베이스를 만들려면 아마 곡을 아티스트, 앨범 및 장르가 포함 된 루트 요소로 배열로 설정해야합니다. David Bowie/Queen 's 'Under Pressure'(2 명의 아티스트, 여러 앨범)와 같은 것들을 허용합니다. – JWally

답변

9

불행히도 현재는 업데이트 당 하나의 "$"위치 만 사용할 수 있습니다. 이로 인해 문서의 예제와 비슷한 하나의 내장 배열로 업데이트가 제한됩니다. http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (귀하의 게시물에서 이미 발견 한 것처럼 보이지만이 게시물을 읽는 다른 사용자를 위해 링크가 포함되어 있습니다.)

업데이트를하려면 다음 세 가지 중에서 두 위치의 위치를 ​​알아야합니다. "bands"배열의 밴드 위치, 앨범 배열의 앨범 위치, 또는 "트랙"배열의 트랙 위치.

이 기능에 대한 기능 요청이 있으며 2.3.0 버전입니다 (변경 될 수 있음).
https://jira.mongodb.org/browse/SERVER-831 당분간

"위치 적 연산자는 중첩 된 배열을 일치", 당신은 세 가지 배열 중 두 가지의 하위 문서의 위치를 ​​알고 있어야합니다

db.music.update({genre : "Grunge", "bands.name" : "Nirvana"}, {$set:{"bands.$.albums.0.tracks.0.name":"Smells Like Teen Spirit!"}}) 

db.music.update({genre : "Grunge", "bands.0.albums.name" : "Nevermind"}, {$set:{"bands.0.albums.$.tracks.0.name":"Smells Like Teen Spirit!"}}) 

또는

db.music.update({genre : "Grunge", "bands.0.albums.0.tracks.order" : 1}, {$set:{"bands.0.albums.0.tracks.$.name":"Smells Like Teen Spirit!"}}) 
+3

버전 2.6.x에서 이전 버전과의 호환성이 손상된 것 같습니다. 두 번째 예제 ("mongodb 2.6.4")에서 "위치 연산자가 쿼리에서 필요한 일치를 찾지 못했습니다."라는 메시지가 나타납니다. 이전 버전에서는 잘 작동합니다. – bersam

+3

버그이며 승인했습니다.이 답변은 더 이상 mongoDB 2.6에서 유효하지 않습니다. https://jira.mongodb.org/browse/SERVER-14886 – bersam