今回は、インデックスの削除を行います。
インデックスの削除
インデックスの削除にはdropIndexを使用します。
第1引数にはインデックス名を指名します。
(インデックス名はgetIndexesで取得できるnameフィールドの値です。)
[Mongoシェル]
1 | > db.position.getIndexes() |
positionコレクションのname_1インデックスを削除することができました。
次回は、インデックスの再構築を行います。
今回は、インデックスの削除を行います。
インデックスの削除にはdropIndexを使用します。
第1引数にはインデックス名を指名します。
(インデックス名はgetIndexesで取得できるnameフィールドの値です。)
[Mongoシェル]
1 | > db.position.getIndexes() |
positionコレクションのname_1インデックスを削除することができました。
次回は、インデックスの再構築を行います。
今回は、インデックス作成のオプションを確認します。
インデックスを作成する時には、オプション指定することができます。
オプションの一覧は下記の通りです。
| 項目名 | 説明 |
|---|---|
| background | バックグラウンドでインデックスを作成します。 デフォルトはfalseです。 |
| name | インデックス名を指定します。 |
| unique | tureを指定するとユニークインデックスを作成します。 ユニークインデックスにすると、nullは入れられません。 デフォルトはfalseです。 |
| partialFilterExpression | フィルターを作成し、フィルターに一致したドキュメントの部分インデックスを作成します。 フィルターには以下の条件を設定できます。 ・等式(key:valueまたは$eq) ・$exists (trueのみ) ・$gt, $gte, $lt, $lte ・$type ・$and |
memberコレクションに対して、インデックス名を”index_e_id”とし、バックグラウンドでインデックスを作成すると下記のようになります。
インデックスのオプションはcreateIndexの第2引数に指定します。
[Mongoシェル]
1 | > db.member.createIndex({e_id:1}, {name:'index_e_id', background:true}) |
memberコレクションに対して、所属(group)が”開発1部”のドキュメントだけに対してインデックスを作成すると下記のようになります。
[Mongoシェル]
1 | > db.member.createIndex({e_id:1}, {partialFilterExpression:{group:"開発1部"}}) |
次回は、インデックスの削除を行います。
インデックスの確認と作成を行います。
memberコレクションのインデックスを確認します。
インデックスの確認にはgetIndexes()を使用します。
[Mongoシェル]
1 | > db.member.getIndexes() |
_idフィールドに昇順(=1)のインデックスが作成されていることが分かります。
インデックス名(name)は_id_です。
これは自動的に作成されるデフォルトインデックスです。
memberコレクションにインデックスを作成します。
インデックスの作成にはcreateIndex()を使います。
引数にはフィールド名と昇順(=1)か降順(=-1)を指定します。
フィールド名はカンマ区切りで複数指定可能です。
[Mongoシェル]
1 | > db.member.createIndex({LastName:1}) |
インデックスが1つから2つに増えたことが確認できます。
“ok”が1となっているのでインデックスが1つ作成されたということになります。
作成したインデックスを確認します。
[Mongoシェル]
1 | > db.member.getIndexes() |
デフォルトインデックス(_id)のほかに、LastNameフィールドにもインデックスが作成されていることが確認できます。
インデックス作成時にインデックス名を指定していなかったので、自動的に”LastName_1”というインデックス名になっています。
次回は、インデックス作成のオプションを確認します。
MongoDBでは大量のデータを処理することが多いため、インデックスの作成は必須の設定と言えます。
今回はインデックスの種類についてまとめます。
MongoDBでは、次のようなインデックスの種類があります。
性能面の観点からインデックスをつけるべきフィールドは次の2つです。
インデックスを作成すると検索を速くすることができますが、無駄なインデックスがあると次のようなデメリットが発生するので注意が必要です。
ただ、このデメリット以上に検索がとても速くなるため、ほとんどのコレクションでインデックスを使うことになります。
次回は、インデックスの確認と作成を行います。
今回は、一括削除を行います。
順次処理で一括削除を行います。
(並列処理で実行したい場合は、initializeOrderedBulkOp()の代わりにinitializeUnorderedBulkOp()を使います。)
処理の詳細は以下の通りです。
[Mongoシェル]
1 | > var bulk = db.member.initializeOrderedBulkOp() |
3件のドキュメントを一括で削除することができました。
上記の処理をPythonで行うと、次のようになります。
[ソースコード]
1 | import pymongo |
次回からは、検索を高速化するためのインデックに関する操作を行います。
今回は、一括登録/一括更新処理(upsert)を行います。
順次処理で一括登録/一括更新処理(upsert)を行います。
upsert処理では該当するデータが存在する場合は更新を行い、該当するデータがない場合は登録を行います。
(並列処理で実行したい場合は、initializeOrderedBulkOp()の代わりにinitializeUnorderedBulkOp()を使います。)
処理の詳細は以下の通りです。
[Mongoシェル]
1 | > var bulk = db.member.initializeOrderedBulkOp() |
前半の3ドキュメントに関してはデータが存在していたので、既存データにageフィールドが追加されています。
最後の1ドキュメントに関してはデータが存在していなかったため、新規ドキュメントとしてデータが追加されています。
上記の処理をPythonで行うと、次のようになります。
[ソースコード]
1 | import pymongo |
Pythonでupsert処理を行う場合は、UpdateOneを使ってupsert=Trueオプションを追加します。
次回は、一括削除処理(remove)を行います。
今回は、一括入れ替え処理を行います。
順次処理で一括入れ替えを行います。
(並列処理で実行したい場合は、initializeOrderedBulkOp()の代わりにinitializeUnorderedBulkOp()を使います。)
処理の詳細は以下の通りです。
[Mongoシェル]
1 | > var bulk = db.member.initializeOrderedBulkOp() |
問題なく3つのドキュメントの入れ替えを行うことができました。
上記の処理をPythonで行うと、次のようになります。
[ソースコード]
1 | import pymongo |
ReplaceOneの第1引数には検索条件を指定し、第2引数には入れ替えるドキュメントの内容を設定します。
次回は、一括登録/一括更新処理(upsert)を行います。
今回は、一括更新(Bulk)に関する操作を行います。
順次処理で一括更新を行います。
(並列処理で実行したい場合は、initializeOrderedBulkOp()の代わりにinitializeUnorderedBulkOp()を使います。)
処理の詳細は以下の通りです。
[Mongoシェル]
1 | > var bulk = db.member.initializeOrderedBulkOp() //順次処理 |
問題なく3つのドキュメントの年齢(age)を更新することができました。
上記の処理をPythonで行うと、次のようになります。
[ソースコード]
1 | import pymongo |
次回は、一括入れ替え処理を行います。
今回から、一括処理(Bulk)に関する操作を行っていきます。
大量にinsertやupdateを行う場合、一括処理(Bulk)を使うとまとめて処理を行うことができるため速く実行することができます
一括処理(Bulk)には、下記の2種類があります。
順次処理で一括登録を行います。
(並列処理で実行したい場合は、initializeOrderedBulkOp()ではなくinitializeUnorderedBulkOp()を使います。)
処理の詳細は以下の通りです。
[Mongoシェル]
1 | > var bulk = db.member.initializeOrderedBulkOp() //順次処理 |
問題なく3つのドキュメントを追加することができました。
上記の処理をPythonで行うと、次のようになります。
3~4行目に新たにimport文を追加していますのでご注意下さい。
[ソースコード]
1 | import pymongo |
次回は、一括更新処理を行います。
今回は、集計結果のソート/表示件数制限/取得開始位置の指定を行います。
以前用意した会社の部、課、従業員データを使用します。
集計処理(aggregate)①データ準備 - https://ailog.site/2021/09/02/2021/0902/
集計結果をソートしてみます。
集計結果のソートには$sortを使います。
[Mongoシェル]
1 | > db.employee.aggregate([ |
課ごとの最大給料に関して、昇順でソートすることができました。
集計結果の表示件数を制限します。
集計結果の表示件数制限には$limitを使います。
[Mongoシェル]
1 | > db.employee.aggregate([ |
課ごとの最大給料に関して、表示件数を1件に制限することができました。
集計結果の取得開始位置を指定します。
集計結果の表示開始位置を指定するためには$skipを使用します。
[Mongoシェル]
1 | > db.employee.aggregate([ |
課ごとの最大給料に関して、表示開始位置を2つめからとすることができました。
$skipに指定するインデックスは0から始まりますので、1を指定した場合は2つめの集計結果から表示されることになります。
$sort、$limit、$skip は組み合わせて実行することが可能ですが、上から順番に実行されるので順番には気を付ける必要があります。
上記の集計処理をPythonで行うと、次のようになります。
[ソースコード]
1 | import pymongo |
次回からは、一括高速処理(Bulk)を行います。