リリース間近！MongoDB 2.6のリリースノート翻訳: 新登場のWrite Commandたち


MongoDB Advent Calendarの穴埋め用投稿です。

そろそろリリースされそうなMongoDB 2.6のリリースノートの一部を翻訳しました。今回は大きな機能追加があった書き込み処理についてです。
_注: MongoDBでは2.5.xは開発バージョンで、2.6.xがリリースバージョンとなります。_

他の翻訳

- [まとめ！MongoDB 2.6のリリースノート翻訳と所感](http://qiita.com/syokenz/items/a0be8a8bc8b79d471ccf)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: 既存機能の変更点](http://qiita.com/syokenz/items/8a261ccead180b3e3243)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: Aggregation Pipelineの変更点](http://qiita.com/syokenz/items/e3a09442445478832a36)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: 新機能と改善点](http://qiita.com/syokenz/items/50af0aee28c8adf0ae13)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: エンタープライズ向け機能](http://qiita.com/syokenz/items/c3e4c5ec94152365c7d3)

## はじめに: 新登場のWrite Commands

MongoDB 2.6では、db.runCommandを使った新しい形式で書き込み処理(insert, update, delete)ができるようになりました。

例えば、runCommandを使ってinsertを行うコマンドはこのようになります。

```
db.runCommand(
   {
      insert: “people”,
      documents: [ { name: "Sam", state: "active" } ],
      ordered: false,
      writeConcern: { w: 1 }
   }
)
```

変更点

- オプションが指定できるようになりました。例えば、これまではドライバ経由でしか指定できなかったwriteConcern（書き込み保証レベル）が指定できます。
- 実行後、特に失敗時に詳細なステータスがリターンされるようになりました。

ところで、従来の<code>db.{collection}.insert()</code>はどうなったかというと、特に削除されている訳ではなく、使えます。ただし、中身は大きく変わっています。

mongoシェルで<code>db.{collection}.insert</code>と<code>()</code>を外して実行すると、functionの定義が確認できますが、2.4.xと2.5.xでは大きく変わっています。

それではリリースノートの翻訳に入ります。

元のリリースノートはこちら
http://docs.mongodb.org/master/release-notes/2.6/

****


## 目次

### 書き込みオペレーションの変更点

- 新しい書き込み系コマンド
- 新しいUpdateオペレーター
 - <code>$mul</code> Updateオペレーター 
 - <code>xor</code>演算を使用した<code>$bit</code>オペレーター
 - <code>$min</code> Updateオペレーター
 - <code>$max</code> Updateオペレーター
 - <code>$currentDate</code> Updateオペレーター
- <code>$push</code> UpdateオペレーターのためのModifiersのエンハンス
 - <code>$each</code> Modifierの変更
 - <code>$sort</code> Modifierのエンハンス
 - <code>$slice</code> Modifierのエンハンス
 - <code>$position</code> Modifire 


### 新しい書き込み系コマンド

新しいinsert, update, deleteコマンドがサポートされました。これらのコマンドは明示的に書き込み保証レベル（write concern）を指定でき、複数ドキュメントのバルクインサートにおいて、どれか一つが失敗しても継続するように指定できます。

詳細情報: 

- [insert](http://docs.mongodb.org/master/reference/command/insert/#dbcmd.insert)
- [update](http://docs.mongodb.org/master/reference/command/update/#dbcmd.update)
- [delete](http://docs.mongodb.org/master/reference/command/delete/#dbcmd.delete)

バージョン2.5.4、またはそれ以降のMongoDBインスタンスにmongoシェルで接続した場合、デフォルトで新しい書き込みオペレーションが使われます。
_訳注: db.{collection}.insert()でもrunCommandと同様に、新しい書き込みオペレーションが使われます。_

以前のバージョンのMongoDBインスタンスに接続した場合は、従来の書き込みオペレーションを使用します。

MongoDB, Inc.が開発している各言語用の公式なMongoDBドライバは、バージョン2.6のリリース前に新しい書き込みコマンドをサポートします。詳細については使っているドライバのリリースノートを参照してください。

### 新しいUpdateオペレーター

書き込み系と同じく、更新系のオペレーターも追加/変更されました。

#### <code>$mul</code> Updateオペレーター

<code>$mul</code>オペレーターを使用すると、指定した値でフィールド値を乗算することができます。

詳細情報: [$mul](http://docs.mongodb.org/master/reference/operator/update/mul/#up._S_mul)

####  <code>xor</code>演算を使用した<code>$bit</code>オペレーター

<code>$bit</code>オペレーターは論理XOR演算を使用してビット単位の更新をサポートします。

詳細情報: [$bit](http://docs.mongodb.org/master/reference/operator/update/bit/#up._S_bit)

#### <code>$min</code> Updateオペレーター

<code>$min</code>オペレーターは、指定した値が現在のフィールド値よりも小さかったら、フィールド値を指定した値に更新します。

詳細情報: [$min](http://docs.mongodb.org/master/reference/operator/update/min/#up._S_min)

#### <code>$max</code> Updateオペレーター

<code>$max</code>オペレーターは、指定した値が現在のフィールド値よりも大きかったら、フィールド値を指定した値に更新します。
 
詳細情報: [$max](http://docs.mongodb.org/master/reference/operator/update/max/#up._S_max)

#### <code>$currentDate</code> Updateオペレーター

<code>$currentDate</code>オペレーターは現在時刻をセットします。Date型、timestamp型を選択できます。

詳細情報: [$currentDate](http://docs.mongodb.org/master/reference/operator/update/currentDate/#up._S_currentDate)


### <code>$push</code> UpdateオペレーターのためのModifiersのエンハンス

<code>$push</code>オペレーターは機能性と使いやすさを向上させるため、<code>$sort</code>, <code>$slice</code>, <code>$each</code> modifiersのサポートを強化しました。

また、<code>$push</code>オペレーターには<code>$position</code> modifierが追加されました。
_訳注: <code>$position</code>については後ほど説明があります。_


詳細情報: [$push](http://docs.mongodb.org/master/reference/operator/update/push/#up._S_push)

#### <code>$each</code> Modifierの変更

<code>$sort</code>, <code>$slice</code>, <code>$position</code> modifireと合わせて使用する場合、<code>$each</code>は<code>$push</code>の最初のmodifierである必要はなくなりました。


詳細情報: [$each](http://docs.mongodb.org/master/reference/operator/update/each/#up._S_each)

#### <code>$sort</code> Modifierのエンハンス

<code>$sort</code>を使って、通常の配列を並び替えることができるようになりました。
_訳注: これまでのバージョンでは、ドキュメントを要素として持つ配列のみソートできました。_


この変更は、ドキュメントではない配列の要素を使ったソートができることを意味します。
また、もし配列の要素がドキュメントだった場合、ドキュメントのフィールド指定だけでなく、ドキュメント全体でのソートが可能です。
_訳注: つまり、通常の配列である_

```
array[12, 43, 6, 89, 77, 90]
```

_もソートできるようになりました。_

_また、ドキュメントの配列である_

```
array[
  { id: 3, score: 8 },
  { id: 4, score: 7 },
  { id: 5, score: 6 }
]
```

_では、フィールドを指定してもしなくてもソートができるようになりました。_
_フィールドを指定しなかった場合は、第1要素（上記の場合はid）でソートされます。_


<code>$sort</code>は、もはや<code>$slice</code>を必要としません。

詳細情報: [$sort](http://docs.mongodb.org/master/reference/operator/update/sort/#up._S_sort)

#### <code>$slice</code> Modifierのエンハンス

<code>$slice</code> modifierが整数値の指定できるようになりました。整数値を指定すると、配列の前から数えた要素数番目でスライスします。
_訳注: 例えば、<code>$sort</code>といっしょに使うと、”配列をソートして上位3つを切り出す”という処理ができます。_


詳細情報: [$slice](http://docs.mongodb.org/master/reference/operator/update/slice/#up._S_slice)

#### <code>$position</code> Modifire 

<code>$position</code> modifierは、<code>$push</code>オペレーターを使った際に、値を挿入する箇所を明示的に指定できます。

詳細情報: [$position](http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position)