2012-03-08 5 views
3

MongoDB champs de mise à jour dans tableau imbriquéchamps de mise à jour dans MongoDB tableau imbriqué

Comment puis-je régler « jouer » à « jouer photo » dans le tableau de photos?

Je ne connais que son _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" 
}] 

Répondre

6

Vous ne pouvez pas. L'opérateur de position est uniquement disponible pour le premier tableau de votre hiérarchie de documents. En tant que tel, vous ne pouvez pas manipuler des éléments individuels de réseaux plus profonds.

Il est un problème connu et est prévu pour le développement ici: https://jira.mongodb.org/browse/SERVER-831

Jusqu'à ce moment-là, vous devrez normaliser votre schéma un peu j'ai peur.

+0

Merci, mais je ne peut pas changer mon schéma. Je vais tirer l'élément, le modifier et le repousser. bien que son inefficace. – tonilin

+3

C'est une option mais elle a de sérieux problèmes de simultanéité (une écriture peut écraser les résultats d'une écriture simultanée) donc à utiliser avec précaution. –

0

Tonilin Vous Cant Mise à jour ce type de tableau directement pour cela, vous devez trouver l'index de ce tableau dans lequel vous souhaitez mettre à jour comme si vous souhaitez mettre à jour name comme play photo alors vous devez trouver l'index de photos où le nom est play. Pour cela, j'utilisé ce code comme:

$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; 

// Maintenant, pour mettre à jour cette valeur dans votre base de données utilisez ce code ...

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); 
} 
Questions connexes