MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

$toLowerを使ってMongoDBコレクションの値を小文字に更新する方法

MongoDBには、集計(アグリゲーション)フレームワークの一部として使用できる $toLower 演算子が用意されています。しかし、forEach ループを使って特定のフィールドを順番に処理し、1件ずつ更新する方法もあります。

この記事では、両方のアプローチを具体的なサンプルコードとともに解説します。

1. サンプルコレクションの作成

まず、ドキュメントを含むコレクションを作成しましょう。

> db.toLowerDemo.insertOne({"StudentId":101,"StudentName":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9b1b4515e86fd1496b38bf")
}
> db.toLowerDemo.insertOne({"StudentId":102,"StudentName":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9b1b4b15e86fd1496b38c0")
}
> db.toLowerDemo.insertOne({"StudentId":103,"StudentName":"CHris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9b1b5115e86fd1496b38c1")
}
> db.toLowerDemo.insertOne({"StudentId":104,"StudentName":"ROBERT"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9b1b5a15e86fd1496b38c2")
}

2. 現在のドキュメントを確認する

find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。

> db.toLowerDemo.find().pretty();

実行すると、次のような出力が得られます。StudentName フィールドには大文字と小文字が混在しているのがわかります。

{
   "_id" : ObjectId("5c9b1b4515e86fd1496b38bf"),
   "StudentId" : 101,
   "StudentName" : "John"
}
{
   "_id" : ObjectId("5c9b1b4b15e86fd1496b38c0"),
   "StudentId" : 102,
   "StudentName" : "Larry"
}
{
   "_id" : ObjectId("5c9b1b5115e86fd1496b38c1"),
   "StudentId" : 103,
   "StudentName" : "CHris"
}
{
   "_id" : ObjectId("5c9b1b5a15e86fd1496b38c2"),
   "StudentId" : 104,
   "StudentName" : "ROBERT"
}

3. forEachループで小文字に一括変換する

$toLower のような変換を実現するには、find().forEach() を使って各ドキュメントを走査し、JavaScriptの toLowerCase() メソッドで値を小文字に変換して保存します。

> db.toLowerDemo.find().forEach(
...    function(lower) {
...       lower.StudentName = lower.StudentName.toLowerCase();
...       db.toLowerDemo.save(lower);
...    }
... );

このスクリプトは、コレクション内の全ドキュメントに対して以下の処理を行います。

  • 各ドキュメントの StudentName フィールド値を取得
  • toLowerCase() で小文字に変換
  • save() で元のドキュメントを上書き更新

4. 更新結果の確認

もう一度同じクエリを実行して、更新が正しく反映されたか確認しましょう。

> db.toLowerDemo.find().pretty();

実行すると、すべての名前が小文字に変換されていることがわかります。

{
   "_id" : ObjectId("5c9b1b4515e86fd1496b38bf"),
   "StudentId" : 101,
   "StudentName" : "john"
}
{
   "_id" : ObjectId("5c9b1b4b15e86fd1496b38c0"),
   "StudentId" : 102,
   "StudentName" : "larry"
}
{
   "_id" : ObjectId("5c9b1b5115e86fd1496b38c1"),
   "StudentId" : 103,
   "StudentName" : "chris"
}
{
   "_id" : ObjectId("5c9b1b5a15e86fd1496b38c2"),
   "StudentId" : 104,
   "StudentName" : "robert"
}

補足:updateManyと集計パイプラインを使う方法

MongoDB 4.2以降では、updateMany の更新操作に集計パイプラインを指定できるため、サーバー側だけで $toLower を使った一括変換が可能です。

> db.toLowerDemo.updateMany(
...    {},
...    [ { $set: { StudentName: { $toLower: "$StudentName" } } } ]
... );

この方法なら、アプリケーション側でのループ処理が不要になり、大量データの一括変換をより効率的に実行できます。用途やデータ量に応じて、forEach ループ方式と使い分けるとよいでしょう。

  1. JavaでMongoDBコレクション内の複数のドキュメントを一括更新する方法

    MongoDBでは、updateMany()メソッドを使うことで、指定した条件に一致するコレクション内のすべてのドキュメントを一度に更新できます。1件だけを更新するupdateOne()とは異なり、フィルターに合致した全件が更新対象になる点が大きな特徴です。 基本構文 db.COLLECTION_NAME.updateMany(<filter>, <update>) Javaから利用する場合は、com.mongodb.client.MongoCollectionインターフェースが同名のupdateMany()メソッドを提供しています。第1引数に検索条件(フィルター)、第

  2. JavaでMongoDBコレクションの既存ドキュメントを更新する方法

    MongoDBシェルのupdate()メソッドは、既存のドキュメント内の値を更新するために使用されます。 構文 db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA) JavaからMongoDBのドキュメントを操作する場合は、com.mongodb.client.MongoCollectionインターフェースが提供するupdateOne()メソッドを使用することで、条件に一致した単一のドキュメントを更新できます。 このメソッドには、次の2つの引数を渡します。 フィルター(Filter):更新対象のドキュメントを特定するための検