【问题标题】:Insert if not exist else push into array(as well as update old values) in mongodb php?如果不存在,则插入 mongodb php 中的数组(以及更新旧值)?
【发布时间】:2012-09-11 11:00:59
【问题描述】:

我有一个 mongodb 集合,格式为

{ "_id" : ObjectId("50072b17b4a6de3b1100000f")
 "employment_details" : [
 {
         "_id" : ObjectId("50072b17b4a6de3b11000015"),
         "title" : "Information Technology Compliance & Security",
         "rank" : null,
         "department" : null,
         "current" : true,
         "company_id" : ObjectId("5007269fb4a6de941001d19d")
 }
 ]
}

我需要的是,如果“employment_details”数组为空或不存在,我需要创建新值并将其插入到employment_details 中,否则我需要推送像这样的细节,

 { "_id" : ObjectId("50072b17b4a6de3b1100000f")
 "employment_details" : [
 {
         "_id" : ObjectId("50072b17b4a6de3b11000015"),
         "title" : "Information Technology Compliance & Security",
         "rank" : null,
         "department" : null,
         "current" : false,
         "company_id" : ObjectId("5007269fb4a6de941001d19d")
 }
  ......
 {
         "_id" : ObjectId("50072b17b4a6de3b11000018"),
         "title" : "security engineer",
         "rank" : null,
         "department" : null,
         "current" : false,
         "company_id" : ObjectId("5007269fb4a6de941001dasd")
 }
 {
         "_id" : ObjectId("50072b17b4a6de3b11000016"),
         "title" : "software Engineer",
         "rank" : null,
         "department" : null,
         "current" : true,
         "company_id" : ObjectId("5007269fb4a6de94100189e")
 }
]
}

但棘手的部分是,由于我正在推送特定员工的就业详细信息,因此必须设置“employment_details”中的“current”字段 true 仅适用于新插入的联系人,旧 employment_details 中的所有其他“current”字段必须设置为 false,就像我提到的在上面的例子中。

实际上,当插入一个新的 employement_detail 时,它的 current 字段必须设置为 true,而所有其他 current > 以前的就业详情中的字段必须设置为 false

我知道推送值的一般语法,但是如何更新旧值和推送新值?

希望我的问题很清楚。

更新代码(我试过的):

$my_collection->update(
  array("_id"=>$id), 
  array('$push' => 
   array(
     "employment_details" => array("title" => $title, "rank" => $rank, "department" => $dept, "current" => "true", "company_id" => $c_id)
  ))
);

但我不知道如何更新以前的值。

【问题讨论】:

  • 是否有一小段代码您实际尝试过?
  • $my_collection->update(array("_id"=>$id), array('$push' =>array("employment_details" => array("title" => $title, "rank" => $rank, "current" => "true", "company_id" => $c_id))));
  • 但我真的不知道如何更新以前的值。 @dbf
  • 请将所有未来的代码请求编辑到您的原始帖子中,已经为您编辑了这个。
  • 好的。如果您知道,请发布答案。

标签: php mongodb push mongodb-php


【解决方案1】:

你可以先使用 update 将所有的employment_details.current 设置为false,然后$push 该字段为true 的新记录。

如果您愿意更改架构,则可以通过使用单个对象 current_employment_detail 和一个 past_employment_detail 数组来更优雅地更改数据库架构。我不知道你的用例,但我猜你需要当前的细节比过去的细节更频繁。当您将其作为单个字段时,您正在保存对就业详细信息当前字段的额外搜索。

【讨论】:

  • 如果可能,请帮助我将当前设置为 false 和 $push 新记录的代码,而且我无法更改架构(实际上我不应该)。
  • 还有当你最初将current设置为false时,如果新的就业细节与之前的就业细节相同(即相同的company_id)怎么办,在这种情况下我们不应该推送,我们应该简单更新(当前 = true)。
  • 您需要一个钩子,其中当前值与新值相同,如果相同(无需推送),则更新为 true,否则迭代以删除任何旧值并推送所有新值。请注意,这不是一个“给我代码,因为我要求它”的网站。
  • @dbf 抱歉。没有完全理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多