DocumentDBのコレクションをJSONにエクスポートする
AzureのDocumentDBにはちょっとお試ししたい時などに使えるFreeプランがありません。
なので、ちょっとした開発作業で使う場合などは、蓄積したDocumentDBのデータをJSONファイルとしてエクスポートしてしまい、課金の対象となるコレクションはすぐに削除するようにしています。
通常、データベースのサービスには何らかのインポート/エクスポートのツールが存在しているものです。古くからよくお世話になっているのは、オンプレならSQL ServerのSSISだったり、Azure上ならSQL DatabaseポータルでのBLOBへのエクスポート機能あたりでしょうか。
ところが、DocumentDBには一括エクスポートするような機能がポータルには存在していません。かといって、一時的な作業のためにREST APIやSDKなどを駆使してエクスポートするのもしんどいので、Azure DocumentDB Data Migration Toolというデータ移行用のツールをエクスポートにも利用するのがおすすめです。
Azure DocumentDB Data Migration Tool
このツール、Azure公式Docsの記事データベース移行ツールを使用した DocumentDB へのデータのインポートでは、インポートツールとしてのみ紹介されているため、エクスポート用のツールとしても使えることがあまり知られていないと思います。
ツール自体は、マイクロソフトのダウンロードセンターからzipをダウンロードするだけです。解凍後のフォルダから直接使う形式なので、以下のようにdllやexeが並ぶ構成になっています。
ちなみに、Azure Docs: データベース移行ツールを使用した DocumentDB へのデータのインポートには、エクスポート機能の説明は無いのですが、インポート機能については詳細が書かれています。JSONやCSVなどの一般的なファイルフォーマットからのインポートはもちろん、MongoDBやAmazon DynamoDBからのインポートもサポートしているところなどはなかなかやる気を感じます。
ダウンロードした移行ツールのフォルダにある「dtui.exe」を起動すると(dt.exeはCUI版)、移行ツールのGUI画面が起動します。
DocumentDBコレクションのエクスポート
ソースの設定
DocumentDBからデータをエクスポートする場合は、ソース設定画面で「DocumentDB」を選択し、接続文字列とコレクション名を設定します。クエリはお好みで書くことができます(全件取得なら空白でOKだと思います)。
なお、接続文字列は以下の形式を組み立てる必要があるようです(ポータルからの接続文字列コピーだとエラーになる)。
AccountEndpoint=<url>;AccountKey=<key>;Database=<db> |
また、Advanced OptionのInclude Internal Fieldsで、エクスポート結果にDocumentDBのシステムプロパティを含めるかどうかを指定できます(例:_rid、_ts)。
出力の設定
出力形式はいろいろ選択できますが、後で再度DocumentDBにインポートしやすいように「JSON file」で出力し、Blobストレージに保存したいと思います。なお、出力するファイル名は「BLOB Name」に設定します。
Prettify JSONのオプションを設定しておくと、JSONを整形して出力してくれます(デフォルトでは改行やスペースは付加されない)。直接人間が読む必要がないデータならこのオプションは不要でしょう。
出力の実行
必要に応じてAdvanced configuration画面でエラーログや進行状況の更新頻度などの設定を行い、「Next」で実行画面に遷移します。
実行画面では、「View Command」ボタンからCUI用のコマンドを取得できるので、同じ内容で再実行する必要があるなら、コマンドをコピーして保存しておきましょう(GUIの設定内容は保存できないため)。
実行結果
これらのオプションを付けて「Import」ボタンで実行した結果です(ドキュメントが2件の例)。それなりのドキュメント数があっても、さすがDocumentDBなのでエクスポートはかなり速い印象です。
- 出力先: BLOB
- Include Internal Fields: あり
- Prettify JSON: あり
このエクスポート方法は、年末年始のコレクション大掃除で大活躍しました。
DocumentDBは、使っていないコレクションを放置しておくと結構なコストになるので、使わないコレクションは移行ツールを使ってエクスポートしていまいましょう。