mongodb php $ push не вставляя массив - PullRequest
2 голосов
/ 01 апреля 2012

Я видел несколько других вопросов о толковании PHP $ Mongo здесь, на SO, но по какой-то причине ничего из того, что они говорят, не работает, поэтому я публикую свою собственную версию.

По сути, я пытаюсь следовать руководству, установленному 10gen, где представление чего-то вроде новостной ленты или поста блога / комментария должно выполняться с использованием сегментов - создание документов, содержащих определенное количество (50) событий (комментариев и т. Д.) .), а затем создает несколько документов по мере роста содержания.

Я пытаюсь вставить документы ($event) в массив (events), но, похоже, возникает некоторая путаница с PHP, когда документ не существует (upserting). Я пытался сделать это с помощью вставки, но вставка и $push не очень хорошо сочетаются друг с другом.

Вот что у меня сейчас есть:

$historyDoc = array('_id'=>$uID, 'count'=>1,
  array('$push' => array('events' => $event)));

$query = array('_id'=>$uID);

//add user to history
$collection->update($query,$historyDoc,
    array('safe'=>true,'timeout'=>5000,'upsert'=>true));

Где $event - это правильно отформатированный массив (документ) вещей (например, отметка времени, идентификатор пользователя, действие, имя), а $uID - объект MongoID, взятый из другой коллекции.

Результат, который я получаю, таков:

{
"_id": {
    "$oid": "4f77ec39fef97a3965000000"
    },
"0": {
    "$push": {
        "events": {
            "timestamp": 1333259321,
            "action": "achievement",
            "pts": 0,
            "name": "join"
        }
    }
},
"count": 1
}

Что хорошо, потому что мой документ, по крайней мере, отображается правильно, но как, черт возьми, есть ключ с "$" в нем? Не похоже, что я не смог уйти от $ ... Я очень внимательно использовал одинарные кавычки именно по этой причине.

Может быть, я что-то упускаю, или я сломал PHP, но я боролся с этим некоторое время, и я ничего не могу с этим поделать. Он держит весь мой проект, так что ...>: /

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Это не самое элегантное решение, но, похоже, оно работает. Очевидно, есть проблема с использованием $push в новом документе (вставка или вставка) (РЕДАКТИРОВАТЬ: Это может быть проблема с объединением атомарных и неатомарных вещей, что является проблемой. Вы не можете использовать атомарные операторы в _id, поэтому ...). Тем не менее, вы можете обойти это, вставив документ, а затем обновив / загрузив его.

Чтобы инициализировать массив в Mongo через PHP, вам нужно создать документ со значением пустого массива a, как показано здесь:

$historyDoc = array('_id'=>$uID.'-0',
        'count'=>1, 
        'events'=>array());

Оттуда вы можете просто взять то, что собирались поместить в первый индекс, и добавить его позже:

$collection->update($query, $historyDoc,
             array('safe'=>true,'timeout'=>5000,'upsert'=>true));

$collection->update($query,
            array('$push'=>array('events'=>$event)),
            array('safe'=>true,'timeout'=>5000,'upsert'=>true));

В результате получается документ в форме:

{
"_id": "4f77f307fef97aed12000000-0",
"count": 1,
"events": [
    {
        "timestamp": 1333261063,
        "action": "achievement",
        "pts": 0,
        "name": "join"
    }
]
}

Источник: Mongo PHP Manual - Обновления

1 голос
/ 01 апреля 2012

Ваш документ обновления не сформирован, попробуйте это:

$historyDoc = array('_id' => $uID, 
                    'count' => 1,
                    '$push' => array('events' => $event));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...