1

私はmongodbコレクションに次のコンテンツを持っています、

{ "_id" : ObjectId("5052f343381ef8bc10000011"), "first_name" : "Tadataka", "midle_name"  :      
"", "last_name" : "Yamada", "title" : "Independent Director", "biogra
phy" : "Dr. Tadataka Yamada, M.D., is Independent Director of Agilent Technologi
es Inc., ", "rank" : " ", "department" : " ", "current" : "true", "company_id" :     ObjectId("50072714b4a6deba100051d3"
) } }

上記の内容をいくつかのフィールドで更新し、存在しない場合は新しいフィールドを挿入しようとすると、既存のフィールドが上書きされます。これが私のコードです、

$mycollection->update(array("_id" => $id), array('$set' => array("first_name" => $first_name, "updated_at" => $uat));

そして私が得ている結果は

{ "_id" : ObjectId("5052f343381ef8bc10000011"), "first_name" : "Tadataka", "updated_at" : 134567894 }

値だけを更新するのではなく、コンテンツ全体が上書きされ、欠落している場所になります。

4

2 に答える 2

5

このようにしてみてください

$mycollection->update(
            array("_id" => $id),
            array('$set' => array("first_name" => $first_name, "updated_at" => $uat)),
            array("upsert" => true)
);
于 2012-09-14T10:23:32.037 に答える
3

共有したコードのupdate()は正しいです。アトミック修飾子を使用しているので、指定されたドキュメント全体が上書きされる$set理由はありません。_id次のスクリプトはこれを簡単に再現し、first_nameフィールドが変更され、updated_atフィールドが追加されたサンプルドキュメントを出力します。

<?php

$m = new Mongo();
$c = $m->test->foo;
$c->drop();

$document = array(
    '_id' => new MongoId('5052f343381ef8bc10000011'),
    'first_name' => 'Tadataka',
    'middle_name' => '',
    'last_name' => 'Yamada',
    'title' => 'Independent Director',
    'company_id' => new MongoId('50072714b4a6deba100051d3')
);

$c->insert($document);

$c->update(
    array('_id' => $document['_id']),
    array('$set' => array('first_name' => 'foobar', 'updated_at' => new MongoDate()))
);

var_dump($c->findOne());

これをローカルで実行すると、次のように表示されます。

array(7) {
  ["_id"]=>
  object(MongoId)#8 (1) {
    ["$id"]=>
    string(24) "5052f343381ef8bc10000011"
  }
  ["company_id"]=>
  object(MongoId)#9 (1) {
    ["$id"]=>
    string(24) "50072714b4a6deba100051d3"
  }
  ["first_name"]=>
  string(6) "foobar"
  ["last_name"]=>
  string(6) "Yamada"
  ["midle_name"]=>
  string(0) ""
  ["title"]=>
  string(20) "Independent Director"
  ["update_at"]=>
  object(MongoDate)#10 (2) {
    ["sec"]=>
    int(1347908855)
    ["usec"]=>
    int(551000)
  }
}

貼り付けた最後の結果をどのように取得したかを共有すると役立つでしょうが、更新クエリは確かにここで責任を負いません。

補足としてcurrent、文字列の代わりに、ドキュメントのフィールドに適切なブール値を使用することをお勧めします"true"

于 2012-09-17T19:13:15.983 に答える