# 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 (デフォルト)

これはデフォルトのモードです。クエリ結果はコレクションに追加されます。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。

この方法は[**アトミック**](/products/customer-data-platform/data-workbench/databases/data-management)です。

### mode=replace

コレクションが既に存在する場合、既存のコレクションの行はクエリ結果で置き換えられます。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。

**単一のトランザクション**で次の3つのステップを実行することにより、**アトミック性**(コレクションのコンシューマーが常に一貫性のあるデータを持つようにする)を実現します。

1. 一時コレクションを作成します。
2. 一時コレクションに書き込みます。
3. RENAME コマンドを使用して、既存のコレクションを一時コレクションで置き換えます。


この方法は[**アトミック**](/products/customer-data-platform/data-workbench/databases/data-management)です。

### mode=truncate

システムはまず既存のコレクションを切り捨て、次にクエリ結果を挿入します。コレクションがまだ存在しない場合は、新しいコレクションが作成されます。

REPLACE とは異なり、TRUNCATE はコレクションのインデックスを保持します。

この方法は[**アトミック**](/products/customer-data-platform/data-workbench/databases/data-management)です。

### 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
```