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

MongoDBで同じ名前のアイテムの挿入を制限する方法

MongoDBで同じ名前のアイテムの挿入を制限する方法

MongoDBで同じ名前のアイテム(同一の値を持つドキュメント)の挿入を制限するには、ensureIndex()メソッドでユニークインデックスを作成し、unique:trueオプションを設定します。これにより、重複する値を持つドキュメントを挿入しようとした時点で重複キーエラー(E11000)が発生し、登録が自動的に拒否されます。

なお、ensureIndex()は新しいバージョンのMongoDBでは非推奨(deprecated)となっているため、新規開発ではcreateIndex()の使用が推奨されます。ユニークインデックスを作成して重複を防ぐという点では、どちらも同じ働きをします。

ユニークインデックスを作成してドキュメントを挿入する

まず、コレクション「demo316」の「SubjectName」フィールドにユニークインデックスを作成し、その後いくつかのドキュメントを挿入してみましょう。

> db.demo316.ensureIndex({"SubjectName":1},{unique:true});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.demo316.insertOne({"SubjectName":"MySQL"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e50e378f8647eb59e56205d")
}
> db.demo316.insertOne({"SubjectName":"MongoDB"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e50e37df8647eb59e56205e")
}

「MySQL」と「MongoDB」の2件は問題なく挿入できました。しかし、すでに存在する「MongoDB」と同じ値をもう一度挿入しようとすると、次のように重複キーエラーが発生します。

> db.demo316.insertOne({"SubjectName":"MongoDB"});
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: test.demo316 index: SubjectName_1 dup key: { : \"MongoDB\" }",
    "op" : {
        "_id" : ObjectId("5e50e381f8647eb59e56205f"),
        "SubjectName" : "MongoDB"
    }
})

エラーコードE11000は、ユニークインデックスによって同じキー値を持つドキュメントがすでに存在していることを示すものです。この仕組みのおかげで、誤った重複データの登録を未然に防ぐことができます。

find()メソッドでコレクション内の全ドキュメントを確認する

find()メソッドを使えば、コレクション内のすべてのドキュメントを表示できます。

> db.demo316.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e50e378f8647eb59e56205d"), "SubjectName" : "MySQL" }
{ "_id" : ObjectId("5e50e37df8647eb59e56205e"), "SubjectName" : "MongoDB" }

出力結果から、重複した「MongoDB」のドキュメントは登録されておらず、ユニークインデックスによって同じ名前のアイテムの重複挿入が正しく制限されていることが確認できます。

  1. JavaScriptで配列の要素を同じ配列内に複製する方法

    JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont

  2. MySQLでGROUP BYとORDER BYを使って同名の学生のスコアを合計・並べ替える方法

    はじめにMySQLで同じ名前の学生ごとにスコアを合計し、その結果を並べ替えて表示したい場合は、GROUP BY句とORDER BY句を組み合わせて使用します。GROUP BYで学生名ごとにレコードをグループ化し、SUM()関数でスコアを合計、最後にORDER BYで結果を昇順または降順にソートします。この記事では、実際にテーブルを作成しながら、具体的な手順を解説します。サンプルテーブルの作成まず、学生名と数学のスコアを格納するテーブルを作成しましょう。以下のCREATE TABLE文を実行します。mysql> create table countRowValueDemo-> (-&