今回は 「MongoDB において 一意制約 (ユニーク制約) をかける方法」 についてまとめます。
一意制約 (ユニーク制約) の 適用
MongoDB で 一意制約 をかけるには インデックス作成時 createIndex()
のオプション unique
に true
を指定することで実現できます。
以下では「単一キーインデックス」の場合と「複合キーインデックス」の場合についてサンプルコードを見ていきます。
単一キーインデックス
単一キーインデックスであれば単純に以下のようなコードを mongo シェル上で実行すれば作成できます。
1 | > db.members.createIndex({ userId: 1 }, { unique: true }) |
複合キーインデックス
複合キーインデックスの場合であっても単一キーインデックスとコードは変わりません。
1 | > db.members.createIndex({ firstname: 1, lastname: 1 }, { unique: true }) |
複合キーインデックスの場合、複合キーの組み合わせで一意になればよいので、以下のいずれでも問題なく挿入できます。
1 2 3 | > db.members.insert({ firstname: "Tsuyoshi" , lastname: "Tanaka" }) > db.members.insert({ firstname: "Satoshi" , lastname: "Tanaka" }) > db.members.insert({ firstname: "Tsuyoshi" }) |
一意制約 (ユニーク制約) の 動作制限
RDB の場合とも似ていますが、すでに重複データが入ってしまったコレクションに対して一意制約をかけることはできません。 まぁ、すでに重複してしまっている状態では当然といえば当然かと思いますが…
また、ハッシュインデックスに対して一意制約を行うことは推奨されないようです。 (Hashed Indexes の Considerations )
一意制約 キー に 値 が 設定されない場合 の 挙動
上記「複合キーインデックス」で一意制約を行うパターンのデータ挿入例にもありましたが、値がないフィールドが存在する場合、内部的には null
が指定されたものとして処理されます。
例えば、以下のようにフィールド x
に対する一意制約があるコレクションがある場合において、
1 | > db.collection.createIndex({ x: 1 }, { unique: true }) |
フィールド x
を指定しないデータを挿入したとします。
1 2 | > db.collection.insert({ y: 1 }) WriteResult({ "nInserted" : 1 }) |
初回は x: null
として入るので正常に挿入できます。
続けて再度 フィールド x
が存在しない別のデータを挿入するとどうでしょうか。
1 2 3 4 5 6 7 8 | > db.collection.insert({ z: 1 }) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error collection: test.collection index: x_1 dup key: { : null }" } }) |
エラーが発生して挿入できないことがわかります。
また、エラーメッセージからも指定がなければ null
が挿入されていたことがわかります。
今回は 「MongoDB において 一意制約 (ユニーク制約) をかける方法」 についてまとめました。 ポイントは以下の通りです。 参考になったでしょうか?
createIndex()
で{ unique: true }
オプションを指定すると一意制約が作成できる
本記事がお役に立っていると嬉しいです!!
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!