2012-08-14 57 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