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

MongoDBで新しく作成したコレクションにドキュメントをコピーする方法

MongoDBでは、aggregate()メソッドと$outステージを組み合わせることで、既存のコレクションから新しく作成したコレクションへドキュメント(行)を簡単にコピーできます。この記事では、実際のコマンド例を使いながら、コレクション間でデータをコピーする手順をわかりやすく解説します。

基本的な構文

コレクションの内容を別のコレクションにコピーするには、以下の構文を使用します。「yourOldCollectionName」がコピー元の既存コレクション、「yourNewCollectionName」がコピー先の新しいコレクションです。

db.yourOldCollectionName.aggregate([{ $sample: { size: 333333 }}, {$out: "yourNewCollectionName"} ],{allowDiskUse: true});

各要素の役割は次のとおりです。

  • $sample:コレクションから指定した件数のドキュメントをランダムに抽出します。sizeにコピーしたいドキュメント数以上の値を指定します。
  • $out:集計結果を指定した名前のコレクションに出力します。コレクションが存在しない場合は自動的に作成されます。
  • allowDiskUse: true:大量のデータを扱う際に、メモリ不足を防ぐためディスク使用を許可するオプションです。

ステップ1:コピー元のコレクションを作成する

まず、サンプルデータを持つコレクション「sourceCollection」を作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。

> db.sourceCollection.insertOne({"EmployeeName":"Robert","EmployeeSalary":15000});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0397c1f5e889d7a5199506")
}
> db.sourceCollection.insertOne({"EmployeeName":"David","EmployeeSalary":25000});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0397c3f5e889d7a5199507")
}
> db.sourceCollection.insertOne({"EmployeeName":"Mike","EmployeeSalary":29000});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0397c4f5e889d7a5199508")
}

ステップ2:挿入されたドキュメントを確認する

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

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

実行すると、以下のような出力が得られます。

{
   "_id" : ObjectId("5e0397c1f5e889d7a5199506"),
   "EmployeeName" : "Robert",
   "EmployeeSalary" : 15000
}
{
   "_id" : ObjectId("5e0397c3f5e889d7a5199507"),
   "EmployeeName" : "David",
   "EmployeeSalary" : 25000
}
{
   "_id" : ObjectId("5e0397c4f5e889d7a5199508"),
   "EmployeeName" : "Mike",
   "EmployeeSalary" : 29000
}

ステップ3:コピー先の新しいコレクションを作成する

次に、createCollection()メソッドでコピー先となる新しいコレクション「destinationCollection」を作成します。

> db.createCollection('destinationCollection');
{ "ok" : 1 }

ステップ4:ドキュメントを新しいコレクションにコピーする

ここで本題のコピー処理です。以下のクエリを実行すると、「sourceCollection」のドキュメントが「destinationCollection」にコピーされます。

> db.sourceCollection.aggregate([{ $sample: { size: 333333 }}, {$out: "destinationCollection"} ],{allowDiskUse: true});

$sampleのsizeを元のコレクションのドキュメント総数以上に設定することで、すべてのドキュメントがコピー対象になります。

ステップ5:コピー結果を確認する

最後に、新しいコレクションの中身をfind()メソッドで確認しましょう。

> db.destinationCollection.find().pretty()

実行すると、最初のコレクション「sourceCollection」からレコードが正しくコピーされていることがわかります。なお、$sampleはランダム抽出を行うため、出力順序は元のコレクションと異なる場合があります。

{
   "_id" : ObjectId("5e0397c4f5e889d7a5199508"),
   "EmployeeName" : "Mike",
   "EmployeeSalary" : 29000
}
{
   "_id" : ObjectId("5e0397c3f5e889d7a5199507"),
   "EmployeeName" : "David",
   "EmployeeSalary" : 25000
}
{
   "_id" : ObjectId("5e0397c1f5e889d7a5199506"),
   "EmployeeName" : "Robert",
   "EmployeeSalary" : 15000
}

補足:全ドキュメントを確実にコピーしたい場合

$sampleによるランダム抽出ではなく、すべてのドキュメントをそのままの順序でコピーしたい場合は、$matchステージを使用する方法も便利です。

db.sourceCollection.aggregate([ { $match: {} }, { $out: "destinationCollection" } ]);

この方法なら条件なしですべてのドキュメントが出力先コレクションに書き込まれます。用途に応じて使い分けるとよいでしょう。

  1. JavaでMongoDBコレクションに複数のドキュメントを挿入する方法

    MongoDBでは、insertMany()メソッドを使用することで、既存のコレクションに複数のドキュメントを一度に挿入できます。本記事では、シェルからの基本的な操作方法と、Javaプログラムから実行する手順を解説します。 基本構文 db.coll.insert(docArray) 各要素の意味は以下のとおりです。 db:データベース名 coll:ドキュメントを挿入するコレクション名 docArray:挿入したいドキュメントの配列 シェルでの実行例 > use myDatabase switched to db myDatabase > db.sampleCollection.

  2. JavaでMongoDBコレクションにドキュメントを挿入する方法を徹底解説

    MongoDBでは、insert()メソッドを使うことで、既存のコレクションにドキュメントを挿入できます。 構文 db.coll.insert(doc) 各要素の意味は以下の通りです。 db: 接続先のデータベース coll: ドキュメントを挿入するコレクション名 doc: 挿入したいドキュメント mongoシェルでの実行例 > use myDatabase() switched to db myDatabase() > db.createCollection(sample) { "ok" : 1 } > db.sample.insert({name: