0

私の構造は次のようになります。

"_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
        ]
    } 
]

エンコーダー名 = '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);

しかし、それは機能していません。$filter に 2 つのアイテムを追加できるかどうかわかりません。また、$update もオフになっている可能性があります。

mongodb の新機能。どんな助けでも素晴らしいでしょう。ありがとう!

4

1 に答える 1

3

どのサブアレイを更新する必要があるかをmongoに伝える部分がありません。フィルターを渡すだけでオブジェクト全体が返され、更新を試みると、どの「エンコーダー」配列を更新するかわかりません。これは、$ 位置演算子を使用して Mongo で修正されます。こちらの説明をご覧ください。

したがって、更新ステートメントは次のようになります。

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

位置演算子を追加することで、Mongo はフィルターを取得し、フィルターを一致させたエンコーダーに更新を適用します。

于 2012-08-15T01:52:17.363 に答える