0

次の形式の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に設定する必要があり、古い employee_details の他のすべての " current " フィールドを設定する必要があることです。 false、上記の例で述べたように。

実際には、新しいEmployment_detailが挿入されると、その現在のフィールドをtrueに設定する必要があり、以前の employee_details の他のすべての現在のフィールドを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)
  ))
);

しかし、以前の値を更新する方法がわかりません。

4

1 に答える 1

0

最初に update を使用して、すべての employee_details.current を false に $set し、次にこのフィールドが true である新しいレコードを $push することができます。

スキーマを変更したい場合は、単一のオブジェクト current_employment_detail と past_employment_detail の配列を使用してデータベース スキーマを変更すると、よりエレガントに変更できます。ユースケースはわかりませんが、過去の詳細よりも現在の詳細が必要になることが多いと思います。これを個別のフィールドとして使用すると、employment_detail.current フィールドの追加検索を節約できます。

于 2012-09-11T11:28:37.283 に答える