2012-05-02 2 views
1

В MongoDB-PHP Я использую следующий пример код для толкания новой записи в конец массива внутри коллекции ...MongoDB + PHP: Как передать элемент массиву с помощью специального ключа?

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

Это возвращает ключи, как 0,1,2,3 .. .. т.е.

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

То, что я хочу сделать, это магазин YearWeekNumber как ключ, как это ...

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

Как сохранить/обновить ключ вместе с новой записью? Я предполагаю, что вы не можете использовать $ push. Что вы просто используете .save или .update, но как вы передаете ключ?

ответ

2

Вы бы сделать это с помощью $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))) 
); 

Я бы, однако не рекомендуем это делать. Лучше установить другой ключ с этим значением «201205123», так как иначе вы не сможете делать запросы диапазона по этому значению или устанавливать индекс.

+0

Я только начал dabling с Монго, и я пробуя различные схемы. Я бы проиндексировал «число», «неделя», «год» ... ключ только для того, чтобы вытащить отдельную запись явно, если это необходимо, а также, поэтому у меня нет дубликатов. Set/Save будет обновляться, а не вставлять его снова. –

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