MongoDBで2つのフィールド(列)の組み合わせを一意に保つ方法
MongoDBでは、複数のフィールド(列)の値の組み合わせが重複しないようにしたい場合、ユニークインデックス(unique index)を作成します。インデックス作成時に unique オプションを true に設定することで、指定した2つのフィールドの組み合わせがコレクション内で一意に保たれます。
ユニークな複合インデックスの作成
以下の例では、「StudentFirstName」と「StudentLastName」の2つのフィールドに対して複合インデックスを作成し、unique を true に設定しています。
>db.keepTwoColumnsUniqueDemo.createIndex({"StudentFirstName":1,"StudentLastName":1},{unique:true});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}これで、2つのフィールドの組み合わせに対する一意性制約が有効になりました。続いて、このコレクションにドキュメントを挿入して動作を確認してみましょう。
ドキュメントの挿入と重複チェックの検証
>db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30fd7b64f4b851c3a13e5")
}
>db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30fe5b64f4b851c3a13e6")
}
>db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith","StudentAge":24});
2019-05-08T22:50:42.803+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: sample.keepTwoColumnsUniqueDemo index: StudentFirstName_1_StudentLastName_1 dup key: { : "John", : "Smith" } :
WriteError({
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: sample.keepTwoColumnsUniqueDemo index: StudentFirstName_1_StudentLastName_1 dup key: { : \"John\", : \"Smith\" }",
"op" : {
"_id" : ObjectId("5cd30feab64f4b851c3a13e7"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentAge" : 24
}
})
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1上記の結果を見ると、最初の2件のドキュメントは問題なく挿入されています。「John & Smith」と「John & Doe」は名字が異なるため、組み合わせとしては重複していないからです。しかし、3件目の「John & Smith」は既存のドキュメントと同じ組み合わせのため、挿入に失敗し、次のエラーが表示されました。
duplicate key error collection
これは E11000 duplicate key error と呼ばれるエラーで、ユニークインデックスの制約に違反する書き込み操作をMongoDBが拒否したことを示しています。つまり、一意性の設定が正しく機能している証拠です。
登録済みドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.keepTwoColumnsUniqueDemo.find().pretty();
実行すると、次の出力が得られます。
{
"_id" : ObjectId("5cd30fd7b64f4b851c3a13e5"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentAge" : 21
}
{
"_id" : ObjectId("5cd30fe5b64f4b851c3a13e6"),
"StudentFirstName" : "John",
"StudentLastName" : "Doe",
"StudentAge" : 23
}このように、重複していない組み合わせのドキュメントのみが登録されていることが確認できます。なお、複合ユニークインデックスは各フィールド単体ではなく「組み合わせ全体」に対して一意性を適用する点に注意してください。片方のフィールドだけが同じでも、もう片方が異なれば登録は可能です。
-
Android SQLiteで2つの列(カラム)を連結して表示する方法【サンプルコード付き】
AndroidにおけるSQLiteデータベースとは 実装に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしておきましょう。SQLiteはオープンソースのSQLデータベースで、デバイス上のテキストファイルにデータを保存します。Androidには標準でSQLiteの実装が組み込まれており、リレーショナルデータベースの基本的な機能をすべて利用できます。また、JDBCやODBCのような接続設定が不要で、手軽にデータベースへアクセスできる点も大きな特徴です。 本記事では、AndroidのSQLiteで2つの列(カラム)を連結して1つの列として表示する方法を、サンプルコード
-
MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方
MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、