MongoEngineは、PythonからMongoDBを操作するためのオブジェクトドキュメントマッパー(ODM)です。 ODMレイヤーは、オブジェクトモデルをリレーショナルデータベースにマッピングするORMと同様の方法で、オブジェクトモデルをドキュメントデータベースにマッピングします。 MongoEngineのようなODMは、リレーショナルデータベースのような機能を提供します。アプリケーションレベルでのスキーマ施行、外部キー、フィールドレベルの制約など。
ここにチュートリアルを含め、MongoEngineの使用法を学ぶための多くの優れたリソースが利用可能です。
この投稿では、MongoDB pythonチュートリアルとしてインデックスを作成するためのMongoEngineプログラミング構造と、それに関連するパフォーマンスのオーバーヘッドについて説明します。
MongoEngineでの自動インデックス作成
デフォルトでは、MongoEngineは、クラス名の複数形として名前が付けられたコレクションにドキュメントを保存します。たとえば、以下に示すUserクラスは、usersという名前のコレクションに格納されます。モデルは、MongoEngineクラスのDocumentを継承して、マップされたオブジェクトになる必要があります。
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
上で定義されたUserクラスは、2つのインデックスを宣言します:1。名前(ソート順)と2.電子メール(ハッシュ)。 MongoEngineは、最初のアップサート操作で宣言された各インデックスを作成します。これらのインデックスは、createIndex/ensureIndex呼び出しを介してコレクションに作成されます。 MongoEngineは、ドキュメントがコレクションに挿入されるたびにこれらのインデックスを作成しようとします。
例:
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
この呼び出しの結果、3つになります データベースサーバーへのコマンドリクエスト:2つ 名前とメールインデックスがユーザーコレクションに存在することを確認するコマンド、1つ 実際のアップサートを行います。
COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "name_1", key: { name: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "email_hashed", key: { email: "hashed" } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.user command: insert { insert: "user", ordered: true, documents: [ { name: "Ross", email: "[email protected]", address: "127, Baker Street", _id: ObjectId('584419df01f38269dd9d63c1') } ], writeConcern: { w: 1 } } ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms
これは、書き込み負荷が低から中程度のアプリケーションでは問題ありません。ただし、アプリケーションが書き込みを多用する場合、これは書き込みパフォーマンスに深刻な悪影響を及ぼします。
自動インデックス作成の回避
'auto_create_index'の場合 falseに設定されています メタディクショナリでは、MongoEngineはインデックスの自動作成をスキップします。書き込み操作中に追加のcreateIndex要求は送信されません。自動インデックス作成をオフにすると、データベースのデプロイ中にインデックスが通常適用される本番システムでも役立ちます。
たとえば
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
書き込みを多用するアプリケーションを設計している場合は、スキーマの設計段階でインデックスを決定し、アプリケーションをデプロイする前でもインデックスをデプロイするのが理にかなっています。既存のコレクションにインデックスを追加することを計画している場合は、ドキュメントに従ってレプリカセットにインデックスを作成することをお勧めします。このアプローチを使用して、サーバーを1つずつ停止し、サーバー上にインデックスを作成します。
MongoEngine create_indexメソッドを使用して、アプリケーション内にインデックスを作成します。
User.create_index(keys, background=False, **kwargs)
ScaleGrid UIを使用して、ダウンタイムのない「ローリング方式」でインデックスを作成することもできます。詳細については、MongoDBインデックス作成のブログ投稿を参照してください。