mongoDB не позволяет мне обновлять

Хорошо, эта проблема сводит меня с ума, я думал, что _id должен был быть ObjectID, хотя при первой вставке он делает это правильно, когда я пытаюсь обновить его с помощью _id, он не работает.

вот мой код

//Save Data
    function savedata($data){
        $collection = $this->db->retail_logs;
        $this->data = $data;

        if($this->data['_id'] == NULL || $this->data['_id'] == "")
        {
            $this->data['_id'] = new MongoId();
        }
        else
        {
         $this->data['_id'] = ObjectID($this->data['_id']);
        }   
        try {
        $collection->update(
            array("_id"=>$this->data['_id']),
            $this->data, // new lead document to insert
            array("upsert" => true, "safe" => true)
            );

            print $this->data['_id'];
        } catch (Exception $e) {
            print "we are not able to update";
        }
    }

я пытался сделать следующее

if($this->data['_id'] == NULL || $this->data['_id'] == "")
            {
                $this->data['_id'] = new MongoId();
            }
            else
            {
             $this->data['_id'] = ObjectID($this->data['_id']);
            }   

но это, кажется, не помогает.

Что происходит, так это то, что он в первый раз правильно вставляет ObjectID (idnumber), затем, когда он переходит к обновлению, удаляет ObjectID() и вставляет новый вывод с тем же идентификатором, что и раньше.

так это выглядит как "ИДЕНТИФИКАЦИОННЫЙ НОМЕР"


person RussellHarrower    schedule 26.07.2012    source источник
comment
Каков результат print_r($e)?   -  person Michael Robinson    schedule 26.07.2012
comment
он обновляется, но вставляет новую строку монго   -  person RussellHarrower    schedule 26.07.2012


Ответы (2)


Ваш исходный код близок, но если вы хотите сделать строку _id правильным типом ObjectID, используйте:

$this->data['_id'] = new MongoId($this->data['_id']);
person Stennie    schedule 26.07.2012

Проверка результата запроса на обновление

Обновление без обновления может изменять или не изменять существующий объект. Upsert либо изменит существующий объект, либо вставит новый объект. Клиент может определить, обновило ли его самое последнее сообщение о соединении существующий объект, выполнив впоследствии команду getlasterror ( db.runCommand("getlasterror" )). Если результат команды getlasterror содержит поле updatedExisting, последним сообщением в соединении был запрос на обновление. Если значение поля updatedExisting равно true, этот запрос на обновление привел к обновлению существующего объекта; если updateExisting имеет значение false, существующий объект не был обновлен. Поле «upserted» будет содержать новое значение _id, если выполняется вставка (новое в версии 1.5.4).

Можете ли вы запустить команду, предложенную Mongo Docs, и сообщить нам результат выполнения команды?

Ссылка: Обновление Mongo

person user1071979    schedule 26.07.2012