PHP / MongoDB: вставка значения массива в поле массива с помощью модификатора $ pushAll - PullRequest
2 голосов
/ 24 марта 2011

Допустим, у меня есть этот документ, который я хотел бы обновить:

array(
    '_id' => 123,
    'entries' => array(
        '4d8aae834f42e06b638d0000' => array(
            'user_id' => 2,
            'ts' => 'Wed, 23 Mar 2011 19: 37: 55 -0700'
        )
    )
)

У меня есть массив, который я хотел бы добавить в поле ввода:

$entries = array(
    '4d8aae834f42e06b638d0000' => array('user_id' => 3, 'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700')
    '4d8aae834f42e06b638d3219' => array('user_id' => 4, 'ts' => 'Wed, 22 Mar 2011 19: 37: 55 -0700')
);

Попытка запроса:

$updateData = array(
    '$pushAll' => array(
        'entries' => $entries
    )
);

$db->update('journal', array('_id' => 123), $updateData, array('upsert' => true));

Приведенный выше запрос не добавит новые данные. Изменение модификатора с $ pushAll на $ set, очевидно, не сработает, поскольку он просто заменит то, что уже есть. Я пробовал $ addToSet, и он тоже не работал. У меня сейчас нет выбора.

Вот как я бы хотел, чтобы документ заканчивался на:

array(
    '_id' => 123,
    'entries' => array(
        '4d8aae834f42e06b638d0000' => array(
            'user_id' => 2,
            'ts' => 'Wed, 23 Mar 2011 19: 37: 55 -0700'
        ),
        '4d8aae834f42e06b638d0000' => array(
            'user_id' => 3, 
            'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700'
        ),
        '4d8aae834f42e06b638d3219' => array(
            'user_id' => 4, 
            'ts' => 'Wed, 20 Mar 2011 19: 37: 55 -0700'
        )
    )
)

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

после дополнительных испытаний; Мне удалось найти рабочее решение, если кому-то интересно.

Установка ключей в ваших новых данных с префиксом «записи» (или любым другим именем поля, которое вы обновляете) с модификатором «$ set» поможет вам.

$entries = array(
    'entries.4d8aae834f42e06b638d0000' => array('user_id' => 3, 'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700')
    'entries.4d8aae834f42e06b638d3219' => array('user_id' => 4, 'ts' => 'Wed, 22 Mar 2011 19: 37: 55 -0700')
);

А для обновления:

$updateData = array(
    '$set' => $entries
);

$db->update('journal', array('_id' => 123), $updateData, array('upsert' => true));
1 голос
/ 31 августа 2011

Просто подумал, что дам вам некоторую информацию о вашем рабочем решении.По моему опыту, причина, по которой вы не можете использовать «$ push» или «$ addToSet», заключается в том, что ваши целевые «записи» - это, вероятно, внедренный объект .Вы можете использовать только $ push, $ pushAll, $ addToSet для встроенных массивов , поэтому вам пришлось использовать точечную нотацию для обновления по вашему желанию ...

К сожалению, длянам, php разработчикам, запрос курсора всегда возвращает данные в виде массивов, лучший способ проверить, является ли что-то вроде «records» массивом или объектом, - это запустить find () в оболочке mongo и найти фигурные / квадратныескобки ("{}" или "[]") в результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...