2012-08-14 29 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 
     ] 
    } 
] 

我想的項目推送到流陣列,其中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語句應該是:

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

通過在位置操作蒙戈添加然後採取過濾器和更新適用於導致該過濾器相匹配的編碼器。

+0

工作完美。 :) – RayLoveless 2012-08-20 16:55:26