わかりました、この問題は私を狂わせています._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() が削除され、以前と同じ idnumber を持つ新しいリードが挿入されます。
「IDNUMBER」のように見えます