首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB-PHP更新会覆盖现有内容-为什么?

MongoDB-PHP更新会覆盖现有内容-为什么?
EN

Stack Overflow用户
提问于 2012-09-14 18:10:53
回答 2查看 15.1K关注 0票数 1

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

代码语言:javascript
复制
{ "_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"
) } }

当我试图更新几个字段的上述内容,并插入新的字段,如果不存在,现有的字段被覆盖。这是我的代码,

代码语言:javascript
复制
$mycollection->update(array("_id" => $id), array('$set' => array("first_name" => $first_name, "updated_at" => $uat));

我得到的结果是

代码语言:javascript
复制
{ "_id" : ObjectId("5052f343381ef8bc10000011"), "first_name" : "Tadataka", "updated_at" : 134567894 }

我的整个内容都会被覆盖,而不是只更新值,这是我缺失的地方。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-18 03:13:16

您共享的代码中的update()是正确的。由于您使用的是原子修饰符$set,因此没有理由覆盖给定_id的整个文档。下面的脚本可以轻松地重现这一点,并输出更改了first_name字段并添加了updated_at字段的示例文档:

代码语言:javascript
复制
<?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());

如果在本地运行此命令,您应该会看到:

代码语言:javascript
复制
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"

票数 3
EN

Stack Overflow用户

发布于 2012-09-14 18:23:32

试着这样做

代码语言:javascript
复制
$mycollection->update(
            array("_id" => $id),
            array('$set' => array("first_name" => $first_name, "updated_at" => $uat)),
            array("upsert" => true)
);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12422434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档