DjangoでMongoDBを使用する

-テーブルレイアウトの説明を必要としないオープンソースのドキュメント指向データベース管理システム(DBMS)。 C ++で記述され、Creative Commonsライセンスの下で配布されます。



最近、非常に人気があり、需要があります。 そのため、Djangoフレームワークと組み合わせて使用​​するというアイデアが生まれました。 実際にさらに議論されること。







この問題を解決するには、mongodb-engineアプリケーションを使用します。 このアプリケーションは、他のいくつかのアプリケーションと密接に関連しています。最初にインストールを行います。



Django-nonrel -DjangoでNoSQLをサポートするために使用されます。

pip install hg+https://bitbucket.org/wkornewald/django-nonrel
      
      







djangotoolbox-非リレーショナルデータベースを操作するためのツールのセット。 不要ではありません。

 pip install hg+https://bitbucket.org/wkornewald/djangotoolbox
      
      







そして今、mongodb-engineをインストールしています:

 pip install git+https://github.com/django-nonrel/mongodb-engine
      
      







設定でデータベースを指定します。

 DATABASES = { 'default' : { 'ENGINE' : 'django_mongodb_engine', 'NAME' : 'my_database' } }
      
      







必要に応じて、ホスト、ポート、ユーザー、パスワードも指定できます。



このアプリケーションは、標準のdjangoモデルに含まれていない任意のデータを保存するための2種類のフィールドを提供します。



リストフィールド


リストなど、 BSON形式の配列の表現



 from djangotoolbox.fields import ListField class Post(models.Model): ... tags = ListField()
      
      







 >>> Post(tags=['django', 'mongodb'], ...).save() >>> Post.objecs.get(...).tags ['django', 'mongodb']
      
      







タイプオプション:

 class Post(models.Model): ... edited_on = ListField(models.DateTimeField())
      
      







 >>> post = Post(edited_on=['1010-10-10 10:10:10']) >>> post.save() >>> Post.objects.get(...).edited_on [datetime.datetime([1010, 10, 10, 10, 10, 10])]
      
      







このタイプのフィールドは、1対多の通信に使用すると便利です。

 from djangotoolbox.fields import EmbeddedModelField, ListField class Post(models.Model): ... comments = ListField(EmbeddedModelField('Comment')) class Comment(models.Model): ... text = models.TextField()
      
      







EmbeddedModelField-モデル間の関係を整理するために使用されます。



ディクトフィールド


2番目のタイプのフィールドはDictFieldで、オブジェクトのBSONで使用されます。



 from djangotoolbox.fields import DictField class Image(models.Model): ... exif = DictField()
      
      







 >>> Image(exif=get_exif_data(...), ...).save() >>> Image.objects.get(...).exif {u'camera_model' : 'Spamcams 4242', 'exposure_time' : 0.3, ...}
      
      







タイプオプション:

 class Poll(models.Model): ... votes = DictField(models.IntegerField())
      
      





 >>> Poll(votes={'bob' : 3.14, 'alice' : '42'}, ...).save() >>> Poll.objects.get(...).votes {u'bob' : 3, u'alice' : 42}
      
      







データ更新




 Post.objects.filter(...).update(title='Everything is the same')
      
      







$ set演算子を使用して更新できます

 .update(..., {'$set': {'title': 'Everything is the same'}})
      
      







関数F()と同様に

 Post.objects.filter(...).update(visits=F('visits')+1)
      
      







結果は次のようになります。

 .update(..., {'$inc': {'visits': 1}})
      
      







低レベルのクエリを使用する


Django ORMの機能が不足している場合、MongoDBへのクエリを使用して標準メカニズムをバイパスできます。



raw_query()-1つの引数を取り、標準のDjangoクエリセットの形式でデータを返します。 今後のデータ処理に適したもの。



地理データ、モデルの例:

 from djangotoolbox.fields import EmbeddedModelField from django_mongodb_engine.contrib import MongoDBManager class Point(models.Model): latitude = models.FloatField() longtitude = models.FloatField() class Place(models.Model): ... location = EmbeddedModelField(Point) objects = MongoDBManager()
      
      







特定の座標に近いすべてのポイントを取得します。

 >>> here = {'latitude' : 42, 'longtitude' : 3.14} >>> Place.objects.raw_query({'location' : {'$near' : here}})
      
      







raw_update()-データを更新するための十分な標準ツールがない場合に使用されます。



モデル:

 from django_mongodb_engine.contrib import MongoDBManager class FancyNumbers(models.Model): foo = models.IntegerField() objects = MongoDBManager()
      
      







使用法:

 FancyNumbers.objects.raw_update({}, {'$bit' : {'foo' : {'or' : 42}}})
      
      





この例では、ビット単位のorがデータベース内の各fooに対して実行されます。



このバンドルの可能性はこれで終わりではありませんが、すべてをリストした場合、記事は正当に遅れることはありません。 完全な説明と例は、以下のリンクで見ることができます。



参照:

モンゴッド

mongodb-engine

ブログ作成の例

Github



All Articles