我的结构如下:
"_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);
但它不起作用。我不确定我是否可以在$ filter中添加2个项目,而且我的$ update也可能会关闭。
mongodb新手。任何帮助都会很棒。谢谢!
答案 0 :(得分:3)
你错过了告诉mongo需要更新哪个子数组的部分。通过传递过滤器,它返回整个对象,然后当您尝试进行更新时,它不知道要更新哪个“编码器”数组。这可以通过使用$ positional运算符在Mongo中解决。 See explanation here.
所以你的更新声明应该是:
$update = array('$push' => array('encoders.$.streams' => $newStream));
通过添加位置运算符Mongo,然后获取过滤器并将更新应用于导致过滤器匹配的编码器。