Overview
このガイドでは、Djongoプロジェクトを変更して Diango MongoDBバックエンドを使用する方法を学習できます。 Djongo は、 SQLクエリをMongoDB問い合わせ言語(MQL)クエリに変換するサードパーティのライブラリであり、Dhango バージョン 4.0 以前のバージョンでMongoDB をDiangoバックエンドとして使用できます。ただし、DくださいMongoDBバックエンド は公式にサポートされている統合であり、より包括的な Diango のサポート、 MongoDB の機能へのアクセスの拡張、Diango の新しいバージョンとの互換性を提供します。
このガイドでは、次のアプリケーションコンポーネントを更新して、DjongoアプリケーションをDiango MongoDBバックエンドに移行する方法を示します。
データベース設定
Djongo の代わりに Diango MongoDBバックエンド を使用してMongoDBに接続するには、アプリケーションの settings.pyファイルで DATABASES 設定を変更します。この設定のネストされた ENGINE キーの値を "djongo" から "django_mongodb_backend" に更新します。次に、CLIENT キーではなく、ネストされた HOST キーで接続文字列を指定します。
Tip
DATABASES設定の詳細については、「 データベース接続の構成 」ガイドを参照してください。
例
次の例は、DATABASES 設定を変更してMongoDBバックエンドを使用する方法を示しています。初期設定構成を確認するにはDjongo Django MongoDB Backend[1]タブを選択し、更新された設定を確認するには []タブを選択します。
DATABASES = { 'default': { 'ENGINE': 'djongo', 'CLIENT': { 'host': 'mongodb+srv://cluster0.example.mongodb.net', }, 'NAME': 'my_database' } }
DATABASES = { 'default': { 'ENGINE': 'django_mongodb_backend', 'HOST': 'mongodb+srv://cluster0.example.mongodb.net', 'NAME': 'my_database' }, }
モデル定義
Dpango MongoDBバックエンドを使用するようにモデルを更新するには、モデル定義を次の変更します。
modelsモジュールを、djongoからではなくdjango.dbからインポートします。Diango MongoDBバックエンドが
ObjectIdFieldタイプの_idフィールドを自動的に作成するため、明示的なObjectIdField定義を削除します。MongoDB固有の配列と埋め込みフィールドの構文を変更します。
重要
フィールド型
Djongo と Diango MongoDBバックエンドでは、Diango フィールドが 同じ形式で保存される可能性が高くなります。ただし、統合のフィールド変換プロセスが異なるため、互換性が生じない可能性があります。問題が発生した場合は、このページの右側にある [Rate this page]タブを使用してフィードバックを送信できます。
単一モデルの例
次の例は、Recipe という名前のモデルクラスをDpango MongoDBバックエンドとの互換性のために更新する方法を示しています。初期モデルを表示するには [Djongo]タブを選択し、更新されたモデルを表示するには [Django MongoDB Backend]タブを選択します。
from djongo import models class Tag(models.Model): data = models.CharField(max_length=100) class Meta: abstract = True class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) tags = models.ArrayField(model_container=Tag)
from django.db import models from django_mongodb_backend.fields import ArrayField class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) tags = ArrayField( models.CharField(max_length=100), size=4, null=True, blank=True)
前述のフィールドを保存する Recipeオブジェクトを作成するには、次のコードを使用します。
Recipe.objects.create( title="Tiramisu", cuisine="Italian", cook_time=20, tags=[ {"data": "dessert"}, {"data": "classic"}, {"data": "espresso"}, {"data": "chocolate"} ] )
Recipe.objects.create( title="Tiramisu", cuisine="Italian", cook_time=20, tags=["dessert", "classic", "espresso", "chocolate"] )
埋め込みモデルの例
Djongo を使用する場合、埋め込みMongoDBドキュメントを表すために EmbeddedField を使用できます。複数の埋め込みドキュメントを保存するフィールドを定義するには、ArrayField を使用できます。
Dlango MongoDBバックエンド には、埋め込みドキュメントを表す次のフィールドが用意されています。
EmbeddedModelField: ネストされたモデルを保存しますEmbeddedModelArrayField: ネストされたモデルの配列を保存します
Tip
モデル多形
Djongo フィールドを使用して複数のモデル タイプの配列を保存することはできません。ただし、Dmango MongoDBバックエンドは多形データをサポートするためにPolymorphicEmbeddedModelField フィールドとPolymorphicEmbeddedModelArrayField フィールドを提供します。詳細については、 モデル作成ガイドの「 詳細フィールドの使用 」を参照してください。
次の例では、次の埋め込みモデル フィールドを含む Recipe モデルを定義する models.pyファイルを更新する方法を示しています。
nutrition: 管理情報を表す 1 つの埋め込みNutritionモデルを保存reviews: 個々のレシピレビューを表す複数の埋め込みReviewモデルを保存
初期モデルを確認するには [Djongo]タブを選択し、更新されたモデルを確認するには [Django MongoDB Backend]タブを選択します。
from djongo import models class Nutrition(models.Model): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Meta: abstract = True class Review(models.Model): author = models.CharField(max_length=100) rating = models.IntegerField(default=0) class Meta: abstract = True class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) nutrition = models.EmbeddedField(model_container=Nutrition) reviews = models.ArrayField(model_container=Review)
from django.db import models from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField, EmbeddedModelArrayField class Nutrition(EmbeddedModel): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Review(EmbeddedModel): author = models.CharField(max_length=100) rating = models.IntegerField(default=0) class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) nutrition = EmbeddedModelField(Nutrition, null=True, blank=True) reviews = EmbeddedModelArrayField(Review, null=True, blank=True)
Indexes
Dlango MongoDBバックエンドとの互換性のために Djongoアプリのインデックスを更新するには、Dpango MongoDBバックエンドが提供するインデックスクラスを使用する必要があります。
Djongo は、単一フィールドインデックス、複合インデックス、マルチキーインデックスのクラスなど、各MongoDBインデックスを表す個別のクラスを提供します。
Dlango MongoDBバックエンドは、すべてのインデックスタイプを表す次の 3 つのクラスを提供します。
Indexクラス: Diango のインデックスクラス。すべての非検索インデックスタイプを表しますSearchIndexクラス: MongoDB Search インデックスを表す Diango MongoDBバックエンド固有のクラスVectorSearchIndexクラス: MongoDB ベクトル検索インデックスを表す Diango MongoDBバックエンド固有のクラス
例
次の例では、Recipe モデルで複合インデックスを更新する方法を示しています。 Dlango MongoDBバックエンドの実装ではMongoDB Searchインデックスも追加されています。このインデックスは Djo ではサポートされていません。初期インデックス を確認するには Djongoタブを選択し、アップデートされたインデックスを確認するには Django MongoDB Backendタブを選択します。
from djongo import models from djongo.models.indexes import CompoundIndex class Recipe(models.Model): _id = models.ObjectIdField() title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) class Meta: indexes = [ CompoundIndex(fields=["title", "cook_time"]) ]
from django.db import models from django_mongodb_backend.indexes import SearchIndex class Recipe(models.Model): title = models.CharField(max_length=100) cuisine = models.CharField(max_length=100) cook_time = models.IntegerField(default=0) class Meta: indexes = [ models.Index(fields=["title", "cook_time"]), SearchIndex(fields=["cuisine"], name="cuisine_search_idx") ]
クエリ
Dpango のQuerySet APIを使用して、Djongo とMongoDBバックエンド モデルの両方をクエリできます。ただし、埋め込みモデル クエリの構文は異なります。
Djongo は埋め込みモデルをPython辞書として扱い、そのフィールドにアクセスまたは変更するにはPython辞書構文を使用する必要があります。 Dlango MongoDBバックエンドは埋め込みモデルを Diango モデルとして扱うため、そのフィールドを操作するには他のすべてのモデルと同じ構文を使用します。
重要
パフォーマンス低下
MongoDB Djongo から Dpango MongoDBバックエンドに移行する場合は、パフォーマンスの変化をモニターして潜在的な回帰を特定し、見つかった場合は JIRAチケットをファイルことをお勧めします。
Tip
Diango MongoDBバックエンド を使用してモデルをクエリする方法の詳細については、「 クエリの指定 」ガイドを参照してください。
例
次の例は、Recipe モデルとその 埋め込みモデルフィールド(「埋め込みモデルの例」セクションで定義されている)に対する Djongo と Dlango MongoDBバックエンドnutrition クエリの違いを示しています。このコードは、 埋め込みモデルの フィールドをクエリします。最初のクエリを表示するにはNutrition caloriesDjongo[7]タブを選択し、更新されたクエリを表示するには []タブを選択します。Django MongoDB Backend
Recipe.objects.filter(nutrition__lt={'calories': 500})
Recipe.objects.filter(nutrition__calories__lt=500)
トランザクション
Djongo とMongoDBバックエンド はどちらも、Diango のアトミック トランザクションAPI機能をサポートしています。ただし、この機能を実装するためのカスタムAPIをそれぞれ提供しています。コードのインポート ステートメントを変更することで、Diango MongoDBバックエンドとの互換性のトランザクションを更新できます。
例
次の例は、コードを更新して Dpango MongoDBバックエンドのトランザクションAPIをインポートする方法を示しています。最初のステートメントを表示するにはDjongo []タブを選択し、更新されたステートメントを表示するにはDjango MongoDB Backend [1]タブを選択します。
from djongo import transaction
from django_mongodb_backend import transaction
移行
Djongo はデータベースの移行をサポートしておらず、デフォルトではスキーマ検証を強制しません。 settings.pyファイルで ENFORCE_SCHEMA 設定を True に設定すると、ドキュメントに欠落しているフィールド値がある場合、Djongo は MigrationErrors を強制します。
Dpango MongoDBバックエンドは、一部制限付きでデータベースの移行をサポートしています。これらの制限の詳細については、 機能の互換性ガイドの「 移行サポート 」を参照してください。
Dlango MongoDBバックエンドではスキーマ検証を強制しません。その結果、データベーススキーマを更新するための移行を実行中ずにモデル フィールドを更新しても、エラーは生成されません。
詳細情報
Dpango MongoDBバックエンドを使用する新しいアプリケーションを設定する方法については、「 使い始める 」チュートリアルを参照してください。
Dpango MongoDBバックエンドを使用してデータベース操作を実行中方法の詳細については、 「 CRUD操作の実行 」ガイドを参照してください。