2012-05-02 1 views
1

En MongoDB-PHP J'utilise le code exemple suivant pour pousser une nouvelle entrée à la fin d'un tableau dans une collection ...MongoDB + PHP: Comment pousser un élément vers un tableau avec une clé spécifique?

$data = array(
     "domain"=>"superduperyoyo.com", 
     "number"=>123, 
     "week"=>5, 
     "year"=>2012 
); 
$db->domains->save(
     array('someid' => $someid), 
     array('$push' => array('data' => $data)) 
); 

Cela renvoie les clés comme 0,1,2,3 .. .. ie.

[someid] => somesupercoolid123 
[data] => Array 
    (
     [0] => Array 
      (
       [domain] => superduperyoyo.com 
       [number] => 123 
       [week] => 5 
       [year] => 2012 
      ) 
     [1] => Array(...) 
     [2] => Array(...) 
    ) 

Ce que je veux faire est YearWeekNumber magasin comme la clé comme celui-ci ...

[someid] => somesupercoolid123 
    [data] => Array 
     (
      [201205123] => Array 
       (
        [domain] => superduperyoyo.com 
        [number] => 123 
        [week] => 5 
        [year] => 2012 
       ) 
      [201206123] => Array(...) 
      [201207123] => Array(...) 
     ) 

Comment enregistrer/mettre à jour ne vous la clé ainsi que la nouvelle entrée? Je suppose que vous ne pouvez pas utiliser $ push. Que vous utilisez juste .save ou .update mais comment passez-vous la clé?

Répondre

2

Tu ferais cela en utilisant $set:

$data = array(
     "domain"=>"superduperyoyo.com", 
     "number"=>123, 
     "week"=>5, 
     "year"=>2012 
); 
$db->domains->update(
     array('someid' => $someid), 
     array('$set' => array('data' => array(201205123 => $data))) 
); 

Je cependant recommande pas le faire. Il est préférable de définir une autre clé avec cette valeur "201205123", sinon vous ne seriez pas en mesure d'effectuer des requêtes de plage sur cette valeur ou de définir un index.

+0

Je viens de commencer Dabling avec Mongo et suis d'essayer différents schémas. Je voudrais indexer "nombre", "semaine", "année" ... la clé est juste pour extraire un dossier individuel explicitement si nécessaire et aussi je n'ai pas de doublons. Set/Save sera mis à jour au lieu de l'insérer à nouveau. –

1
$data = array(
     "domain"=>"superduperyoyo.com", 
     "number"=>123, 
     "week"=>5, 
     "year"=>2012 
); 
$update = array(
     '$push' => array('data.201205123' => $data) 
); 
Questions connexes