Вставьте новое значение во внутренний массив с помощью Lithium и MongoDB - PullRequest
1 голос
/ 10 октября 2011

У меня есть такая структура:

[_id] => MongoId Object (
    [$id] => 4e91bcb40b7aab256c000000
)
[campaigns] => Array (
    [0] => Array (
        [campaign_id] => 4e91bcd10b7aab2b6c000000
        [refer_code] => AjZCJR
        [owner] => 1
        [campaign_name] => Test Campaign
        [users] => Array (
        )
    )
    [1] => Array (
        [campaign_id] => 4e9210600b7aab276c000000
        [refer_code] => FQIMJd
        [owner] => 1
        [campaign_name] => New Test Campaign
        [users] => Array (
        )
    )
)

Я хотел бы иметь возможность обновлять массив кампаний новыми полями и обновлять существующие поля в соответствии с идентификатором.

В настоящее время я пытаюсь сделать следующее:

$data = array('campaign_name'=>'changed', 'new_field'=>'its new');
User::update(array('$push'=>array('campaigns.$'=>$data)),array('campaigns.campaign_id'=>$campaign_id));

Однако это не работает - я использую позиционный оператор, чтобы попытаться сопоставить массив с условным оператором, поскольку без него он просто создает новый массив в массиве кампаний.

Я понимаю, что, возможно, я использую это неправильно, так как полагаю, что его следует использовать, выполнив

'campaigns.$.campaign_name'=>'changed'

Однако я не хочу ограничиваться указанием его каждый раз, и мне было интересно, как лучше всего выполнить обновление такого типа без использования цикла for и добавления каждого фрагмента данных (что я сейчас делаю следующим образом :)

$data = array();
foreach($this->request->data as $key=>$value) {
    $data['campaigns.$.'.$key] = $value;
}
User::update($data,array('campaigns.campaign_id'=>$campaign_id));

Если бы кто-нибудь дал мне знать «правильный» способ сделать это, это было бы здорово!

Спасибо:)

Dan

1 Ответ

0 голосов
/ 10 октября 2011

Просто обновление:

$co = array(
        '$pull' => array('campaigns.1" => array('campaign_name' => 'changed'' ) )
);

$p->update(array("_id" => new MongoId( $MongoID  )), $co);
...