MongoDBでフィールド(属性)の値を別のフィールドにコピーする方法
はじめに
MongoDBにおいて、あるフィールド(属性)の値を別のフィールドにコピーしたい場合には、update()メソッドと$set演算子を組み合わせて使用します。この記事では、実際にコレクションを作成し、「date」フィールドの値を「ShippingDate」フィールドへコピーする手順を順を追って解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを挿入し、デモ用のコレクションを作成しましょう。
> db.demo55.insertOne({"ShippingDate":'',"date":new ISODate("2019-01-21")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2716dfcfb11e5c34d89915")
}
> db.demo55.insertOne({"ShippingDate":'',"date":new ISODate("2020-05-12")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2716ebcfb11e5c34d89916")
}挿入したドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo55.find();
このクエリを実行すると、次のような出力が得られます。現時点では「ShippingDate」フィールドが空文字列になっていることを確認してください。
{ "_id" : ObjectId("5e2716dfcfb11e5c34d89915"), "ShippingDate" : "", "date" : ISODate("2019-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e2716ebcfb11e5c34d89916"), "ShippingDate" : "", "date" : ISODate("2020-05-12T00:00:00Z") }フィールドの値をコピーするクエリ
以下が、MongoDBであるフィールドの値を別のフィールドにコピーするための基本的なクエリです。forEach()ですべてのドキュメントを走査し、各ドキュメントに対してupdate()と$setを使って「date」の値を「ShippingDate」に設定していきます。
> db.demo55.find({}).forEach(function(c){
... db.demo55.update({_id: c._id}, {$set: {ShippingDate:c.date}});
... });コピー結果の確認
もう一度find()メソッドを実行して、結果を確認してみましょう。
> db.demo55.find();
出力を見ると、「ShippingDate」フィールドに「date」フィールドの日付値が正しくコピーされていることがわかります。
{ "_id" : ObjectId("5e2716dfcfb11e5c34d89915"), "ShippingDate" : ISODate("2019-01-21T00:00:00Z"), "date" : ISODate("2019-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e2716ebcfb11e5c34d89916"), "ShippingDate" : ISODate("2020-05-12T00:00:00Z"), "date" : ISODate("2020-05-12T00:00:00Z") }補足:モダンな書き方による一括コピー
MongoDB 3.x以降では、従来のupdate()の代わりにupdateOne()やupdateMany()の使用が推奨されています。さらに、集計パイプラインによる更新を利用すれば、アプリケーション側でforEach()によるループ処理を書かずに、サーバー側だけで一括コピーを行うことが可能です。
db.demo55.updateMany(
{},
[ { $set: { ShippingDate: "$date" } } ]
);この方法であれば、大量のドキュメントを扱う場合でも効率的に処理できるため、実運用ではこちらのアプローチがおすすめです。
-
MongoDBでコレクションを別のデータベースにコピーする方法【具体例つきで解説】
MongoDBでコレクションを別のデータベースにコピーする方法 MongoDBには、あるデータベースから別のデータベースへコレクションを一括でコピーする専用のコマンドは用意されていません。その代わり、find()メソッドとforEach()、さらにgetSiblingDB()メソッドを組み合わせることで、コレクション内のドキュメントを別のデータベースへ複製できます。 基本となる構文 以下の構文を使用します。 db.yourCollectionName.find().forEach(function(yourVariableName){ db.getSiblingDB(yourDest
-
MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方
MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、