[MongoDB] 既存データに追加する形でUpdate

$setを利用してUpdateを行う

mongodbではそのままupdateを行うと、デフォルトの動作ではupdateを行ったデータで置き換える処理を行います。これを防ぐために$setを利用する方法があります。

$setを利用すると既存のデータをそのままにして、UPDATE対象になる要素を追加した状態でデータの更新を行うことができます。データとコマンドを追っかけながら行ったほうが早いと思うので。

コマンドを打ってのデータ操作

からのデータベースを用意しておもむろにUpsertを行います。

> db.testcollection.find();
.....

Upsertを行います。三番目の引数にtrueを入れると検索条件がなければインサートを行います。

> db.testcollection.update(
    {model: "2014"},
    {price: 1000, name: "mac book pro", model: "2014"},
    true
);
> db.testcollection.find();
{ "_id" : ObjectId("534d651941ad73530182496e"), "price" : 1000, "name" : "mac book pro", "model" : "2014" }

ここまででupsertを行ったためデータが1件入っていることを確認しています。

$setを使って更新してみる

> db.testcollection.update(
    {model: "2014"},
    {$set: {price: 1500, option: "keyboard"}},
    true
);
> db.testcollection.find();
{ "_id" : ObjectId("534d651941ad73530182496e"), "model" : "2014", "name" : "mac book pro", "option" : "keyboard", "price" : 1500 }

$setを利用してpriceの更新と新たなデータであるoptionが追記されているのがわかるかと思います。

$setを使わないで更新してみる

もし$setを利用しないとどうなるか試してみます。

> db.testcollection.update({model: "2014"}, {price: 500}, true);
> db.testcollection.find();
{ "_id" : ObjectId("534d651941ad73530182496e"), "price" : 500 }

$setを利用しないでupdateを行うと指定したデータであるpriceしか残りませんでした。

もっと詳しく知りたい方は本家のマニュアルへどうぞ