MongoDBで配列を持つ1つのドキュメントを新しいコレクションの複数ドキュメントに変換する方法
MongoDBでは、配列フィールドを持つ1つのドキュメントを、配列の各要素に対応する複数のドキュメントとして新しいコレクションに変換できます。この処理には、集計パイプラインのaggregate()と$unwind、そして結果を別のコレクションに出力するための$outを組み合わせて使用します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成しましょう。
> db.demo757.insertOne(
... {
... "id": 101,
... "Name": ["John", "Bob", "Chris"]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb025745637cd592b2a4ae2")
}
> db.demo757.insertOne(
... {
... "id": 102,
... "Name": ["David"]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb025755637cd592b2a4ae3")
}挿入されたドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo757.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5eb025745637cd592b2a4ae2"), "id" : 101, "Name" : [ "John", "Bob", "Chris" ] }
{ "_id" : ObjectId("5eb025755637cd592b2a4ae3"), "id" : 102, "Name" : [ "David" ] }配列を複数ドキュメントに変換するクエリ
以下は、配列を持つ1つのドキュメントを、新しいコレクション内の複数のドキュメントに変換するクエリです。パイプラインの流れは次のとおりです。
- $unwind: 配列フィールド「Name」を展開し、要素ごとに1つのドキュメントを生成します。
- $project:
_id: 0を指定して元の_idフィールドを出力から除外し、新しい_idが自動的に採番されるようにします。 - $out: 処理結果を指定したコレクション(ここでは「demo758」)に書き込みます。
> db.demo757.aggregate([
... {$unwind: '$Name'},
... {$project: {_id: 0}},
... {$out: 'demo758'}
... ])
> db.demo758.find();実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5eb02582192bedc4738b5881"), "id" : 101, "Name" : "John" }
{ "_id" : ObjectId("5eb02582192bedc4738b5882"), "id" : 101, "Name" : "Bob" }
{ "_id" : ObjectId("5eb02582192bedc4738b5883"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5eb02582192bedc4738b5884"), "id" : 102, "Name" : "David" }このように、元のコレクションでは1件だったドキュメントが、配列の要素数(id:101は3件、id:102は1件)に応じて分割され、新しいコレクション「demo758」に個別のドキュメントとして保存されていることが確認できます。$outは既存のコレクションを完全に置き換える点に注意してください。既存データを保持したい場合は、別のコレクション名を指定するか、事前にバックアップを取ることをおすすめします。
-
MongoDBでサーバーレコードを含むコレクションのステータスを非アクティブに更新する方法
MongoDBでサーバーのステータスを非アクティブに更新する方法サーバーレコードを含むMongoDBコレクションでは、配列形式で保存されたサーバー情報の中から特定のサーバーだけを探し出し、そのステータスを「Active(アクティブ)」から「Inactive(非アクティブ)」へ変更したいケースがあります。この記事では、位置指定演算子「$」を使って、配列内の条件に一致した要素だけを効率的に更新する手順を解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って、サーバー情報(serverInformation)を配列として持つドキュメントを挿入し、コレクシ
-
MongoDBで生年月日を年齢に変換する方法
MongoDBでは、集計パイプライン(aggregate)を活用することで、保存されている生年月日(DateOfBirth)のデータから現在の年齢を簡単に算出できます。この記事では、実際のコード例を使いながらその手順をわかりやすく解説します。1. コレクションにドキュメントを挿入するまずは、生年月日を含むドキュメントを持つコレクションを作成します。以下のように insertOne() メソッドを使用します。> db.demo754.insertOne({DateOfBirth:new Date(2000-05-03)}); { acknowledged : true, ins