【问题标题】:php/mongoDB: add item to inner arrayphp/mongoDB:将项目添加到内部数组
【发布时间】:2012-08-14 21:57:53
【问题描述】:

我的结构是这样的:

"_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);

但它不起作用。我不确定是否可以将 2 个项目添加到我的 $filter 中,并且我的 $update 也可能关闭。

MongoDB 新手。任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: arrays mongodb push add mongodb-php


    【解决方案1】:

    您缺少告诉 mongo 需要更新哪个子数组的部分。通过仅传递过滤器,它会返回整个对象,然后当您尝试进行更新时,它不知道要更新哪个“编码器”数组。这在 Mongo 中通过使用 $ 位置运算符来解决。 See explanation here.

    所以你的更新语句应该是:

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

    通过添加位置运算符 Mongo 然后获取过滤器并将更新应用于导致过滤器匹配的编码器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多