犬わらノート

ゲームを作ったり、遊んだり

[MongoDB] 複数のフィールドにユニークインデックス(ユニーク制約)を付ける

複数のフィールドを対象にユニークを付ける方法が全く分からなかったのですが、解決しましたので、メモを残しておきます。
 

やりたいこと

やりたかったことは、

> db.collection.find()
{ "_id" : ObjectId("52721881fd0d0e71ffa8c31d"), "a" : 1, "b" : 1 }
{ "_id" : ObjectId("52721884fd0d0e71ffa8c31e"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("52721888fd0d0e71ffa8c31f"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("5272188bfd0d0e71ffa8c320"), "a" : 2, "b" : 2 }

上のようなフィールド "a" と "b" を持つコレクション collection があった時、

> // フィールド "a" のみ重複
> db.collection.insert( { a: 1, b: 3 } )

は挿入できるけど、

> // フィールド "a" と "b" 両方が重複
> db.collection.insert( { a: 1, b: 2 } )

はエラーにしたいということ。


MySQLで例えると

ALTER TABLE collection ADD UNIQUE (a, b);

 

フィールド1つを対象とするなら、以下の方法で OK です。

> // フィールド "a" をユニークにする
> db.collection.ensureIndex( { a: 1 }, { unique: true } )

 

やり方

複数のフィールドをユニークにするのは、以下のようにできます。

> db.collection.ensureIndex( { a: 1, b: 1 }, { unique: true } )

両方のフィールドが重複したドキュメントを挿入しようとすると、ちゃんとエラーになります。

> // フィールド "a" と "b" 両方が重複
> db.collection.insert( { a: 1, b: 2 } )
E11000 duplicate key error index: test_unique.collection.$a_1_b_1  dup key: { : 1.0, : 2.0 }

 

解ってみれば、極単純な事でした。


ググっても全然見つけられなかったのですが、
マニュアル読んだらちゃんと書いてありました。

Create a Unique Index
http://docs.mongodb.org/manual/tutorial/create-a-unique-index/