2010-10-11 35 views
2

Je joue avec Mongo depuis environ une semaine maintenant et je n'arrive toujours pas à savoir comment modifier les tableaux imbriqués dans Mongo avec php.PHP/Mongo: comment mettre à jour les données imbriquées?

Voici donc un exemple de document ...

array (
    '_id' => new MongoId("4cb30f560107ae9813000000"), 
    'email' => '[email protected]', 
    'firstname' => 'Maurice', 
    'lastname' => 'Campobasso', 
    'password' => 'GOD', 
    'productions' => 
    array (
    0 => 
    array (
     'title' => 'a', 
     'date' => '1286811330.899', 
    ), 
    1 => 
    array (
     'title' => 'b', 
     'date' => '1286811341.183', 
    ), 
    2 => 
    array (
     'title' => 'c', 
     'date' => '1286811350.267', 
    ), 
    3 => 
    array (
     'title' => 'd', 
     'date' => '1286811356.05', 
    ), 
), 
) 

Ce que je wan't à faire est de supprimer un tableau à l'intérieur du tableau de productions, mais je ne peux pas travailler comment. J'ai joué avec 'update (' $ pull '=> ... etc)' mais je n'ai pas réussi à le faire fonctionner.

Répondre

4

OK, il y a plusieurs façons de le faire. Dans votre cas, je ferais quelque chose comme

mymongoobject.update($unset : { "productions.2" : 1 } }

C'est essentiellement dire à désinitialiser l'élément » .2" des productions. Certains docs here. $ $ Pull devrait également fonctionner, mais c'est un peu plus difficile car "productions" est en fait un tableau de tableaux (ou objets avec sous-objets). Il faudrait donc faire correspondre exactement les tableaux:

mymongoobject.update($pull : { "productions" : {'title':'d', 'date':'1286811356.05'} }

Dans le cas ci-dessus, le unset est probablement l'option la plus facile (mais il laissera un « trou » dans le tableau)

+0

Unset a travaillé, mais vous avez raison, il a laissé un gros trou sale dans ma base de données, qui déclenche le javascript dans mon application. – cybermotron

+0

Pull a travaillé très bien !! – cybermotron

+0

Génial. Bon à savoir le pull $ travaillé. Bien sûr, le $ pull est vraiment nul si vous avez de gros objets, donc ça vaut la peine de connaître les deux méthodes. La syntaxe javascript pour traiter les "trous" est d'utiliser 'for (var i in values) {values ​​[i]; } 'Cela va danser autour des" trous ". –

1

C'est en fait très facile, contrairement aux trucs traditionnels de SQL, il vous suffit de modifier l'ensemble des données et de le renvoyer.

$cursor = $mongo->yourDB->yourCollection->findOne("_id",4cb30f560107ae9813000000); 
//let's remove last item on productions 
array_splice($cursor["productions"],2); 
//and update the mongo document 
echo $mongo->yourDB->yourCollection->update($cursor); 
//it echoes 1 if successful 

espérons que cela aide.

+1

Merci Sinan I Je vais essayer. Je dois cependant demander, si les productions étaient beaucoup plus importantes, une opération comme celle-là ne serait pas vraiment lente. – cybermotron

+0

C'était un exemple de mise à jour d'un seul document. Si j'ai bien compris votre question, il y a une restriction de Mongo qui dit que vous pouvez mettre 4mb dans un seul document, si vous envisagez de mettre des documents plus volumineux, vous devez configurer gridFS afaik. J'utilise un énorme Mongo db sur une application web et il traite de tels cas assez rapidement. – Sinan

+0

Merci pour clarifier, comme je l'ai dit je ne fais que commencer avec Mongo. – cybermotron