[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/