1

わかりました、この問題は私を狂わせています._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」のように見えます

4

2 に答える 2

2

_id元のコードは近いですが、文字列を正しい ObjectID タイプにしたい場合は、次を使用します。

$this->data['_id'] = new MongoId($this->data['_id']);
于 2012-07-26T05:08:47.913 に答える
0

更新リクエストの結果を確認する

upsert 以外の更新では、既存のオブジェクトが変更される場合と変更されない場合があります。upsert は、既存のオブジェクトを変更するか、新しいオブジェクトを挿入します。クライアントは、その後 getlasterror コマンド ( db.runCommand( "getlasterror" ) ) を発行することにより、接続の最新のメッセージが既存のオブジェクトを更新したかどうかを判断できます。getlasterror コマンドの結果に updatedExisting フィールドが含まれている場合、接続の最後のメッセージは更新要求でした。updatedExisting フィールドの値が true の場合、その更新要求によって既存のオブジェクトが更新されました。updatedExisting が false の場合、既存のオブジェクトは更新されていません。挿入が実行された場合、「upserted」フィールドには新しい _id 値が含まれます (1.5.4 以降の新機能)。

Mongo Docs の提案に従ってコマンドを実行し、コマンドの結果をお知らせください。

参考:モンゴ更新

于 2012-07-26T03:57:57.577 に答える