NodeJS 速習チュートリアル

Node.js MongoDB データの更新

1. ドキュメントの更新

MongoDBでレコード(MongoDBではドキュメントと呼びます)を更新するには、updateOne() メソッドを使用します。

updateOne() メソッドの第1引数は、更新したいドキュメントを特定するためのクエリオブジェクトです。

       注意: クエリに一致するドキュメントが複数存在する場合でも、updateOne() は最初に見つかった1件のみを更新します。

第2引数は、ドキュメントの新しい値を定義するオブジェクトです。

1.1 実装例:住所(address)を条件に名前と住所を更新する

以下のコードは、address が "Valley 345" のドキュメントを探し、name を "Mickey" に、address を "Canyon 123" に更新する例です。

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://127.0.0.1:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // 更新対象を特定するクエリ
  let myquery = { address: "Valley 345" };
  // 新しい値を $set オペレーターで指定
  let newvalues = { $set: { name: "Mickey", address: "Canyon 123" } };
  
  dbo.collection("customers").updateOne(myquery, newvalues, function(err, res) {
    if (err) throw err;
    console.log("1件のドキュメントを更新しました");
    db.close();
  });
});

上記の内容を demo_update_one.js というファイル名で保存し、実行してください。

demo_update_one.js の実行

C:\Users\Your Name>node demo_update_one.js

実行結果:

1 document updated

2. 特定のフィールドのみを更新する

$set オペレーターを使用すると、指定したフィールドのみが更新され、他のフィールドは維持されます。

2.1 実装例:住所のみを更新する

...
  let myquery = { address: "Valley 345" };
  // addressフィールドのみを "Canyon 123" に更新
  let newvalues = { $set: { address: "Canyon 123" } };
  
  dbo.collection("customers").updateOne(myquery, newvalues, function(err, res) {
...

3. 複数ドキュメントの一括更新

クエリの条件に一致するすべてのドキュメントを更新したい場合は、updateMany() メソッドを使用します。

3.1 実装例:名前が "S" で始まるすべてのドキュメントを更新する

以下の例では、正規表現 /^S/ を使用して、住所(address)が "S" で始まるすべてのドキュメントの name を "Minnie" に変更します。

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://127.0.0.1:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // 住所が "S" で始まるドキュメントを検索する正規表現クエリ
  let myquery = { address: /^S/ };
  let newvalues = { $set: { name: "Minnie" } };
  
  dbo.collection("customers").updateMany(myquery, newvalues, function(err, res) {
    if (err) throw err;
    // 更新された件数(nModified)を表示
    console.log(res.result.nModified + " 件のドキュメントを更新しました");
    db.close();
  });
});

demo_update_many.js の実行

C:\Users\Your Name>node demo_update_many.js

実行結果:

2 document(s) updated

4. 結果オブジェクト (Result Object)

updateOne() および updateMany() メソッドを実行すると、データベースへの操作結果に関する詳細情報を含むオブジェクトが返されます。

このオブジェクト内にある result オブジェクトを参照することで、実行ステータスや、実際に何件のドキュメントが更新されたかを確認できます。

4.1 結果オブジェクトの構造

結果オブジェクトは以下のような形式になっています。

{ n: 1, nModified: 2, ok: 1 }
  • n: 条件にマッチしたドキュメント数
  • nModified: 実際に値が変更(更新)されたドキュメント数
  • ok: 操作が成功した場合は 1

4.2 更新件数の取得例

このオブジェクトを使用して、実際に更新されたドキュメント数を表示するには、res.result.nModified プロパティを参照します。

// 実際に更新された件数を表示
console.log(res.result.nModified);

出力結果:

2