MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで重複エントリを防ぐ方法:ユニークインデックスの使い方

MongoDBで重複データの登録を防ぐには

MongoDBにおいて、コレクションへの重複エントリ(重複データ)の登録を防ぎたい場合、createIndex()メソッドを使ってユニークインデックス(一意のインデックス)を作成するのが最も簡単で効果的な方法です。

ユニークインデックスを作成すると、指定したフィールドに同じ値を持つドキュメントがすでに存在する状態で、再度同じ値を挿入しようとした際にエラーが発生し、登録が拒否されます。

基本構文

ユニークインデックスを作成する基本構文は以下のとおりです。

db.yourCollectionName.createIndex({"yourFieldName":1},{unique:true});

第1引数でインデックスを作成するフィールド名を指定し、第2引数のオプションでunique:trueを設定することで、そのフィールド値の一意性が保証されます。

実装例:ユニークインデックスの作成

それでは、実際に構文を実装してみましょう。以下のクエリは、avoidDuplicateEntriesDemoコレクションのUserNameフィールドに対してユニークインデックスを作成する例です。

> db.avoidDuplicateEntriesDemo.createIndex({"UserName":1},{unique:true});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

実行結果を見ると、numIndexesAfterが「2」になっており、新しくインデックスが追加されたことがわかります。

レコードの挿入

次に、作成したコレクションにレコードを挿入してみます。insertOne()メソッドを使用します。

> db.avoidDuplicateEntriesDemo.insertOne({"UserName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c90e1824afe5c1d2279d697")
}

「John」というユーザー名のドキュメントが正常に登録されました。

同じレコードを再挿入した場合の動作

ここで、まったく同じレコードを挿入しようとするとどうなるでしょうか。ユニークインデックスが設定されているため、以下のようなE11000 duplicate key error(重複キーエラー)が発生し、挿入は失敗します。

> db.avoidDuplicateEntriesDemo.insertOne({"UserName":"John"});
2019-03-19T18:03:08.465+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.avoidDuplicateEntriesDemo index: UserName_1 dup key: { : "John" } :
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: test.avoidDuplicateEntriesDemo index: UserName_1 dup key: { : \"John\" }",
    "op" : {
        "_id" : ObjectId("5c90e1844afe5c1d2279d698"),
        "UserName" : "John"
    }
})

このように、エラーコード「11000」の重複キーエラーが返され、同じUserNameを持つドキュメントの登録が自動的に防止されます。アプリケーション側では、このエラーコードを捕捉して適切な処理を行う設計が推奨されます。

別のレコードを挿入

続いて、別のユーザー名を持つレコードを挿入してみます。値が異なるため、問題なく登録できます。

> db.avoidDuplicateEntriesDemo.insertOne({"UserName":"Carol"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c90e18d4afe5c1d2279d699")
}

登録済みドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.avoidDuplicateEntriesDemo.find();

実行結果は以下のとおりです。

{ "_id" : ObjectId("5c90e1824afe5c1d2279d697"), "UserName" : "John" }
{ "_id" : ObjectId("5c90e18d4afe5c1d2279d699"), "UserName" : "Carol" }

結果から、「John」のレコードは1件のみしか存在せず、重複データが確実に排除されていることが確認できます。

まとめ

  • MongoDBで重複エントリを防ぐには、createIndex(){unique:true}オプションを付けたユニークインデックスを作成する
  • 重複データを挿入しようとすると、E11000 重複キーエラーが発生して登録が拒否される
  • 複数フィールドの組み合わせに対しても複合ユニークインデックスを作成できるため、要件に応じて柔軟に活用できる
  1. MySQLのUNIQUE制約で重複する値の挿入を防ぐ方法

    MySQLでは、テーブル作成時にUNIQUE制約を宣言することで、指定したカラムに重複する値が挿入されるのを防ぐことができます。同じ値がすでに存在する場合、INSERT文はエラーとなり、そのレコードは登録されません。 UNIQUE制約の基本構文 UNIQUE制約は、CREATE TABLE文の中で以下のように宣言します。 create table yourTableName ( yourColumnName1 dataType, yourColumnName2 dataType, UNIQUE(yourColumnName1), UNIQUE(yourColu

  2. Pythonでリストから重複して出現する要素を削除し、一意な要素だけを抽出する方法

    はじめに 数値のリスト nums が与えられたとき、リスト内に複数回出現する要素を削除し、一度だけ出現する要素だけを、元のリストでの出現順序を保ったまま残すことを考えます。 例えば、入力が nums = [2, 4, 6, 1, 4, 6, 9] の場合、出力は [2, 1, 9] となります。これは、2・1・9 の3つの要素がそれぞれ一度しか登場しておらず、4 と 6 は2回ずつ出現しているため除外されるからです。 解決のアプローチ この問題は、各要素の出現回数を記録する辞書(ハッシュマップ)を使うことで効率的に解決できます。手順は以下の通りです。 出現回数をカウントするための空の辞書を