Поля обновления MongoDB во вложенном массиве
Как я могу установить «play» для «воспроизведения фото» в массиве фотографий?
Я знаю только его _id.
"_id": ObjectId("4f41a5c7c32810e404000000"), "albums": [ { "_id": ObjectId("4f545d1bc328103812000000"), "name": "album1" , "photos":[{ "_id": ObjectId("4f545d1bc328103812d00000"), "name":"travel photo" },{ "_id": ObjectId("4f545d1bc328103812c00000"), "name":"play" }] }, { "_id": ObjectId("4f545f56c328103c12000000"), "name": "album2" }, { "_id": ObjectId("4f545f68c328103012000000"), "name": "album3" }, { "_id": ObjectId("4f546642c328103c12000001"), "name": "album4" }]
Вы не можете. Оператор позиционирования доступен только для первого массива в иерархии документов. Таким образом, вы не можете манипулировать отдельными элементами более глубоких массивов гнезд.
Это известная проблема и планируется для разработки здесь: https://jira.mongodb.org/browse/SERVER-831
До тех пор вам придется немного нормализовать вашу схему, я боюсь.
Tonilin You Cant Обновите этот тип массива непосредственно для этого, вам нужно найти индекс этого массива, в который вы хотите обновить, например, если вы хотите обновить name
как play photo
тогда вам нужно найти индекс photos
котором play
имя. Для этого я использовал этот код:
$m = new Mongo(); $db=$m->yourdatabase; //testarray is my collection name $result=$db->testarray->find(); $index=''; foreach($result as $res) { if(array_key_exists("albums",$res)) { foreach($res['albums'] as $ralbum) { if(array_key_exists("photos",$ralbum)) { foreach($ralbum['photos'] as $k=>$rphotos) { if(array_key_exists("name",$rphotos)) if($rphotos['name']=='play') $index=$k; } } } } } //echo $index;
// Теперь для обновления этого значения в вашей базе данных используйте этот код …
if($index!=='') { //Run like this in Shell //db.testarray.update({"albums.photos._id":ObjectId("4f545d1bc328103812d00000")},{'$set':{"albums.$.photos.1.name":"play132"}}) $condition=array("albums.photos._id"=>new MongoId("4f545d1bc328103812d00000")); $data=array('$set'=>array("albums.$.photos.".$index.".name"=>"play photo")); $result=$db->testarray->update($condition,$data); $status=$db->Command(array('getlasterror'=>1)); print_r($status); }