1

我在 mongo db 集合中有以下内容,

{ "_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 回答