2012-08-14 3 views
0
에 항목을 추가

내 구조는 다음과 같다 :PHP/MongoDB를는 : 내부 배열

"_id" : { "$oid" : "502ac2858386b3f419000002"} , 
"eventName" : "eventA" , 
"eventStreamName" : "eventA-0001" , 
"encoders" : [ 
    { 
    "encoderName" : "enc-201" , 
    "streams" : [ 
     { "language" : "eng" , "format" : "flash" , "priority" : "primary"} , 
     { "language" : "spa" , "format" : "flash" , "priority" : "primary"} , 
     { "language" : "fra" , "format" : "flash" , "priority" : "primary"} 
     ] 
    } , 
    { 
    "encoderName" : "enc-202" , 
    "streams" : [ 
     { "language" : "eng" , "format" : "flash" , "priority" : "primary"} , 
     { "language" : "spa" , "format" : "flash" , "priority" : "primary"} // i'd like to add stream here 
     ] 
    } 
] 

I는 스트림 배열 encoderName = 'ENC-202'와 EVENTNAME = 'eventA'으로 항목 푸시하고자

는 여기에 내가

$this->liveEvents = $db->selectCollection("liveEvents"); 
    $newStream = array("language" => "ger", 
      "format" => "flash", 
      "priority" => "primary"); 

    $filter = array("eventName" => "eventA", 
        "encoders.encoderName" => "enc-202"); 
    $update = array('$push'=>array('encoders.streams'=>$newStream)); 

    $this->liveEvents->update($filter,$update); 

있지만 작동하지

을 시도했다입니다. 내 $ 필터에 2 개의 항목을 추가 할 수 있는지 잘 모르겠다. 내 $ 업데이트도 꺼져있을 수있다.

mongodb. 어떤 도움이라도 좋을 것입니다. 감사!

답변

2

mongo에게 업데이트해야 할 하위 배열을 알려주는 부분이 누락되었습니다. 필터를 그냥 통과 시키면 전체 객체를 반환하고 업데이트를 시도하면 업데이트 할 "인코더"배열을 알 수 없습니다. 이것은 Mongo에서 $ 위치 연산자를 사용하여 해결됩니다. See explanation here.

그래서 업데이트 문은 다음과 같아야 위치 운영자 몽고에 추가함으로써

$update = array('$push' => array('encoders.$.streams' => $newStream)); 

는 필터를 취하고 필터가 일치 원인 인코더에 업데이트를 적용합니다.

+0

완벽하게 작동했습니다. :) – RayLoveless