Docs Menu
Docs Home
/ /

Djongo アプリケーションの移行

このガイドでは、Djongoプロジェクトを変更して Diango MongoDBバックエンドを使用する方法を学習できます。 Djongo は、 SQLクエリをMongoDB問い合わせ言語(MQL)クエリに変換するサードパーティのライブラリであり、Dhango バージョン 4.0 以前のバージョンでMongoDB をDiangoバックエンドとして使用できます。ただし、DくださいMongoDBバックエンド は公式にサポートされている統合であり、より包括的な Diango のサポート、 MongoDB の機能へのアクセスの拡張、Diango の新しいバージョンとの互換性を提供します。

このガイドでは、次のアプリケーションコンポーネントを更新して、DjongoアプリケーションをDiango MongoDBバックエンドに移行する方法を示します。

  • データベース設定

  • モデル定義

  • Indexes

  • クエリ

  • 移行

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バックエンドを使用するようにモデルを更新するには、モデル定義を次の変更します。

  1. models モジュールを、djongo からではなく django.db からインポートします。

  2. Diango MongoDBバックエンドが ObjectIdField タイプの _idフィールドを自動的に作成するため、明示的な ObjectIdField 定義を削除します。

  3. MongoDB固有の配列と埋め込みフィールドの構文を変更します。

重要

フィールド型

Djongo と Diango MongoDBバックエンドでは、Diango フィールドが 同じ形式で保存される可能性が高くなります。ただし、統合のフィールド変換プロセスが異なるため、互換性が生じない可能性があります。問題が発生した場合は、このページの右側にある [Rate this page]タブを使用してフィードバックを送信できます。

Tip

詳しくは、 「モデル作成ガイド 」を参照してください。

次の例は、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)

Dlango MongoDBバックエンドとの互換性のために Djongoアプリのインデックスを更新するには、Dpango MongoDBバックエンドが提供するインデックスクラスを使用する必要があります。

Djongo は、単一フィールドインデックス、複合インデックス、マルチキーインデックスのクラスなど、各MongoDBインデックスを表す個別のクラスを提供します。

Dlango MongoDBバックエンドは、すべてのインデックスタイプを表す次の 3 つのクラスを提供します。

  • Index クラス: Diango のインデックスクラス。すべての非検索インデックスタイプを表します

  • SearchIndex クラス: MongoDB Search インデックスを表す Diango MongoDBバックエンド固有のクラス

  • VectorSearchIndex クラス: MongoDB ベクトル検索インデックスを表す Diango MongoDBバックエンド固有のクラス

Tip

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バックエンドとの互換性のトランザクションを更新できます。

Tip

Dpango 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操作の実行 」ガイドを参照してください。

Diango MongoDBバックエンド モデルの作成の詳細については、「 モデルの作成 」ガイドを参照してください。

戻る

トランザクション

項目一覧