ドキュメントを更新する

コレクション内のドキュメントを編集/更新してみます。
* ドキュメントを更新する


ドキュメントを更新する

ドキュメントを更新するにはupdate()メソッドを使用します。第1引数で対象となるドキュメントを特定し、第2引数で更新する内容を記述します。

> db.foods.update(
    { name : "越前おろしそば" },
    { name : "越前おろし蕎麦" }
)

下記のような結果が返ってきます。「1件のドキュメントにマッチし、1件のデータが更新された」という意味です。

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

では、どのように更新されたか確認してみます。

> db.foods.find({}, {"_id":0})
{ "name" : "越前おろし蕎麦" }

これは、「{ name : "越前おろしそば" }という条件にマッチしたドキュメントを、{ name : "越前おろし蕎麦" }というドキュメントに置き換える」という処理が実行されたためです。
ドキュメントを丸ごと置き換える場合はこれでいいのですが、そのようなケースは実運用ではさほど多くないと思います。

では、{ name : "越前おろし蕎麦" }というドキュメントに、{ price : 550 }というデータを追加するには、下記のように記述します。

> db.foods.update(
    { name : "越前おろし蕎麦" },
    { $set :
      { price : 550 }
    }
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.foods.find({}, {"_id":0})
{ "name" : "越前おろし蕎麦", "price" : 550 }

このように$set演算子を使用し、オブジェクト内に更新する内容を記述することで、元のデータは残しつつ、新たなデータの追加や編集を行うことができます。

では、値上げしてみます。

> db.foods.update(
    { name : "越前おろし蕎麦" },
    { $set :
      { price : 800 }
    }
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.foods.find({}, {"_id":0})
{ "name" : "越前おろし蕎麦", "price" : 800 }

無事に値上げできました。