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

MongoDBで重複する値を防ぐユニークインデックスの作成方法


MongoDBでは、インデックス作成時にunique: 1(ユニーク制約)を指定することで、コレクション内に重複する値が登録されるのを防ぐことができます。ここでは、ensureIndex()メソッドを使って、配列型フィールド「Marks」にユニークインデックスを作成する手順を解説します。

サンプルコレクションの作成

まず、save()メソッドを使ってドキュメントを含むコレクションを作成します。

> db.demo298.save({Name: 'Chris', Marks: [46, 79] });
WriteResult({ "nInserted" : 1 })
> db.demo298.save({Name: 'David', Marks: [67, 88] });
WriteResult({ "nInserted" : 1 })

ユニークインデックスの作成

次に、ensureIndex()の第2引数で { unique: 1 } を指定し、Marksフィールドにユニークインデックスを作成します。

> db.demo298.ensureIndex({ Marks: 1 }, {unique: 1});
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

配列フィールドにユニークインデックスを作成すると、その配列内のどの要素も、コレクション内の他のドキュメントの配列要素と重複してはならないという制約が適用されます。

重複値の挿入を試みる

この状態で、すでに存在する値「88」を含む新しいドキュメントを挿入しようとすると、E11000 duplicate key error(重複キーエラー)が発生し、書き込みは失敗します。

> db.demo298.save({Name: 'Mike', Marks: [88,98] });
WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "E11000 duplicate key error collection: test.demo298 index: Marks_1 dup key: { : 88.0 }"
   }
})

結果の確認

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

> db.demo298.find();

出力は以下のようになります。

{ "_id" : ObjectId("5e4d56e55d93261e4bc9ea48"), "Name" : "Chris", "Marks" : [ 46, 79 ] }
{ "_id" : ObjectId("5e4d56f55d93261e4bc9ea49"), "Name" : "David", "Marks" : [ 67, 88 ] }

このように、「Mike」のドキュメントは登録されず、重複のない2件のドキュメントだけが保存されていることが確認できます。

補足:現在はcreateIndex()の使用を推奨

なお、ensureIndex()はMongoDB 3.0以前で使われていたメソッドで、現在は非推奨(deprecated)です。最新のMongoDBでは、同等の機能を持つcreateIndex()を使用してください。

db.demo298.createIndex({ Marks: 1 }, { unique: true });
  1. MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法

    MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127

  2. MongoDBでグループごとの最大値を取得する方法($sortと$groupの活用)

    MongoDBで、重複している個別の要素(グループ)ごとに最大値を取得したい場合、aggregate()メソッドと$sort・$groupステージを組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここではdemo750というコレクションに、idとvalueフィールドを持つドキュメントを挿入します。> db.demo750.insertOne({id:101,value:50}); { acknowledged : true, inserted