2012-03-27 3 views
0

내가 콜렉션 (favorites)가에 값을 업데이트하는 $의 사용 :MongoDB를 - 다음과 같이 문서와 하위 배열

{ 
    "_id" : 907, 
    "pictures" : [ 
     { 
     "id" : 107, 
     "url" : "http://url1", 
     "title" : "some title" 
     }, 
     { 
     "id" : 111, 
     "url" : "http://url2", 
     "title" : "some other title" 
     } 
    ] 
} 

그것은 pictures.url를 사용하여 단지 URL을 얻을 매우 쉽습니다.

그러나 즐겨 찾는 이미지가 id=111 인 그림을 저장 한 모든 사용자의 URL을 어떻게 업데이트합니까?

가 나는 해결 방법 사용하여 발견 : pictures.107.id => 107find()를 사용하여 다음

107:['id':107,'url':'http://url1','title':'some title'] 

... 그리고, 그러나 그것은 나에게 바보 보인다.

더 좋은 방법이 있나요?

+0

? '107' 또는'111'을위한 것? 아니면 둘다? – netcoder

+0

은 중요하지 않습니다. 실제로 저는 여러 가지 업데이트를 수행하는 더 좋은 방법이 있는지 (기본적으로 picture_id를 두 번 저장하는) 해결 방법에 의지하지 않고,'pictures.url'을 그대로 보존하고 싶습니다. 'find()'. 해결 방법과 함께 몽고에서 '사진'의 모든 필드를 가져와야 만합니다. –

+0

나는 대답을 게시했으나 다른 답을 받으면 나는 원래 질문을 이해하지 못했을 것입니다. (솔직하게 조금 불분명 함). 정확히 당신이해야 할 일은 무엇입니까? 좋아하는 111 명이있는 모든 사용자의 모든 "url"값을 업데이트하면됩니까? –

답변

2

내가 뭘 찾고 있는지 확실하지 않지만 한 번만 알려 드리겠습니다.

MongoDB에서 $set 연산자를 사용하면 atomic updates을 수행 할 수 있습니다. 그러면 전체 문서가 아닌 전달하는 데이터 만 바뀝니다.

선택할 때 당신이 $elemMatch 연산자를 사용하는 경우 업데이트 할 수 있습니다 만 쿼리와 일치하는 picturesurl :

$mongo->selectCollection('mydb', 'favorites') 
     ->update(
      array('pictures' => array(
       '$elemMatch' => array('id' => 107), 
      )), 
      array('$set' => array('pictures.$.url' => 'http://foobar')) 
     ); 

당신은 업데이트가 $가 참조 pictures.$.url을 포함하고 있음을 알 수 $elemMatch 검색어와 일치하는 요소

당신의 favoritespictures.urlpictures.id으로 111 일치하는 모든 위는 같은 당신에게 무언가를주는 업데이트됩니다

{ "_id" : 907, "pictures" : [ 
    { 
     "id" : 107, 
     "url" : "http://url1", 
     "title" : "some title" 
    }, 
    { 
     "id" : 111, 
     "title" : "some other title", 
     "url" : "http://foobar" // only this one has matched 
    } 
] } 
+0

덕분에 솔루션은 매우 간단했습니다. ('$ elemMatch') –

1
db.favorites.update({pictures: {$elemMatch:{id:111}}}, {'pictures.$.title':"Some Title"}, false, true) 
업데이트 할 않는다 URL