# TD Toolbelt を使用してクエリ結果を出力する ## オンデマンドジョブの場合 オンデマンドジョブの場合は、td query コマンドに --result / -r オプションを追加するだけです。ジョブが完了すると、結果がコレクションに書き込まれます。 ```bash $ td query --result 'mongodb://user:password@host:1234/database/collection' \ -w -d testdb "SELECT code, COUNT(1) FROM www_access GROUP BY code" ``` ## スケジュールされたジョブの場合 スケジュールされたジョブの場合は、ジョブをスケジュールする際に --result / -r オプションを追加します。ジョブが実行されるたびに、結果が mytbl に書き込まれます。 ```bash $ td result:create mydb 'mongodb://user:password@host:1234/database' $ td sched:create hourly_count_example "0 * * * *" \ -d testdb "select count(*) from www_access" --result mydb:mycollection ``` ## フォーマット 結果出力先は、次の形式の URL で表されます: ``` mongodb://username:password@host/database/collection mongodb://username:password@host:port/database/collection ``` 各項目の説明: - **mongodb** は MongoDB への結果出力を識別します。 - **username** と **password** は MongoDB インスタンスへの認証情報です。 - **hostname** は MongoDB インスタンスのホスト名です。 - **port** は MongoDB インスタンスにアクセスするためのポート番号です。これはオプションです。 - **database** は宛先データベースの名前です。 - **collection** は宛先コレクションの名前です。 ## モード 次のモードを使用して、データを追加または削除できます: ``` mongodb://user:password@host:1234/database/collection # append mongodb://user:password@host:1234/database/collection?mode=append # append mongodb://user:password@host:1234/database/collection?mode=replace # replace mongodb://user:password@host:1234/database/collection?mode=truncate # truncate mongodb://user:password@host:1234/database/collection?mode=update&unique=key1 # update ``` ### mode=append (デフォルト) これはデフォルトのモードです。クエリ結果はコレクションに追加されます。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。 この方法は[**アトミック**](https://docs.treasuredata.com/articles/project-product-documentation/about-atomicity)です。 ### mode=replace コレクションが既に存在する場合、既存のコレクションの行はクエリ結果で置き換えられます。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。 **単一のトランザクション**で次の3つのステップを実行することにより、**アトミック性**(コレクションのコンシューマーが常に一貫性のあるデータを持つようにする)を実現します。 1. 一時コレクションを作成します。 2. 一時コレクションに書き込みます。 3. RENAME コマンドを使用して、既存のコレクションを一時コレクションで置き換えます。 この方法は[**アトミック**](https://docs.treasuredata.com/articles/project-product-documentation/about-atomicity)です。 ### mode=truncate システムはまず既存のコレクションを切り捨て、次にクエリ結果を挿入します。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。 REPLACE とは異なり、TRUNCATE はコレクションのインデックスを保持します。 この方法は[**アトミック**](https://docs.treasuredata.com/articles/project-product-documentation/about-atomicity)です。 ### mode=update このモードは、MongoDB の find と「upsert」メソッドを使用します([MongoDB のドキュメント](http://docs.mongodb.org/manual/reference/method/Bulk.find.upsert/)を参照)。簡単に言うと、ユニークインデックスまたは主キーで重複値が発生する場合を除き、行が挿入され、重複する場合は更新が実行されます。引数で指定したフィールドに既にユニークインデックスを作成していることを確認してください。このモードを使用する場合、unique オプションが必須です。 MongoDB はトランザクションをサポートしていないため、このモードではトランザクションのアトミック性を保証できません。 ## Unique このオプションは update モードでのみ関連し、必須です。MongoDB コレクションを更新するために使用するユニークキーまたはキー(カンマ区切り)のカラム名を指定します。 **例** ``` mongodb://user:password@host:1234/database/collection?mode=update&unique=key1 mongodb://user:password@host:1234/database/collection?mode=update&unique=key1,key2,key3 ```