MongoDB ドキュメントの更新
MongoDB では、ドキュメントを更新する操作はさまざまな方法で実装できます。一般的な方法は次のとおりです。updateOne()、updateMany()、replaceOne()、findOneAndUpdate()。
1、updateOne()
updateOne() メソッドは、フィルターに一致する単一のドキュメントを更新するために使用します。
構文:
db.collection.updateOne(filter, update, options)
- filter:ドキュメントを検索するためのクエリ条件。
- update:更新操作を指定するドキュメントまたは更新演算子。
- options:オプションのパラメータオブジェクト。例:
upsert、arrayFiltersなど。
例
db.myCollection.updateOne(
{ name: "Alice" }, // フィルター条件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // オプションパラメータ
);
{ name: "Alice" }, // フィルター条件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // オプションパラメータ
);
2、updateMany()
updateMany() メソッドは、フィルターに一致するすべてのドキュメントを更新するために使用します。
構文:
db.collection.updateMany(filter, update, options)
- filter:ドキュメントを検索するためのクエリ条件。
- update:更新操作を指定するドキュメントまたは更新演算子。
- options:オプションのパラメータオブジェクト。例:
upsert、arrayFiltersなど。
例
db.myCollection.updateMany(
{ age: { $lt: 30 } }, // フィルター条件
{ $set: { status: "active" } }, // 更新操作
{ upsert: false } // オプションパラメータ
);
{ age: { $lt: 30 } }, // フィルター条件
{ $set: { status: "active" } }, // 更新操作
{ upsert: false } // オプションパラメータ
);
3、replaceOne()
replaceOne() メソッドは、フィルターに一致する単一のドキュメントを置き換えるために使用します。新しいドキュメントは古いドキュメントを完全に置き換えます。
構文:
db.collection.replaceOne(filter, replacement, options)
- filter:ドキュメントを検索するためのクエリ条件。
- replacement:古いドキュメントを置き換える新しいドキュメント。
- options:オプションのパラメータオブジェクト。例:
upsertなど。
例
db.myCollection.replaceOne(
{ name: "Bob" }, // フィルター条件
{ name: "Bob", age: 31 } // 新しいドキュメント
);
{ name: "Bob" }, // フィルター条件
{ name: "Bob", age: 31 } // 新しいドキュメント
);
4、findOneAndUpdate()
findOneAndUpdate() メソッドは、単一のドキュメントを検索して更新するために使用します。更新前または更新後のドキュメントを返すことを選択できます。
構文:
db.collection.findOneAndUpdate(filter, update, options)
- filter:ドキュメントを検索するためのクエリ条件。
- update:更新操作を指定するドキュメントまたは更新演算子。
- options:オプションのパラメータオブジェクト。例:
projection、sort、upsert、returnDocumentなど。
例
db.myCollection.findOneAndUpdate(
{ name: "Charlie" }, // フィルター条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // オプションパラメータ、更新後のドキュメントを返す
);
{ name: "Charlie" }, // フィルター条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // オプションパラメータ、更新後のドキュメントを返す
);
オプションパラメータ
これらの更新メソッドの options パラメータには、通常次のオプションを含めることができます。
- upsert:一致するドキュメントがない場合、新しいドキュメントを挿入するかどうか。
- arrayFilters:ネストされた配列を更新するときに、更新する配列要素の条件を指定します。
- collation:文字列を比較するときに使用する照合順序を指定します。
- returnDocument:findOneAndUpdate で使用し、更新前 ("before") または更新後 ("after") のドキュメントを返すかを指定します。
簡単な例
単一のドキュメントを更新:
db.myCollection.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } }
);複数のドキュメントを更新:
db.myCollection.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
);単一のドキュメントを置き換え:
db.myCollection.replaceOne(
{ name: "Bob" },
{ name: "Bob", age: 31 }
);
単一のドキュメントを検索して更新:
db.myCollection.findOneAndUpdate(
{ name: "Charlie" },
{ $set: { age: 36 } },
{ returnDocument: "after" }
);
次の例では、_id が 56064f89ade2f21f36b03136 のドキュメントデータを置き換えました。
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
置き換えが成功したら、find() コマンドで置き換え後のデータを確認できます。
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
>
その他の例
最初のレコードのみ更新:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
すべて更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
最初の1件のみ追加:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
すべて追加:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
すべて更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
最初のレコードのみ更新:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false ); その他の拡張