TL;DR
- REST API Frameworkとセットで使うなら良いライブラリだと思います
- MongoDBとしての機能を使いこなすのは少し難しそう
概要
簡単なWebアプリを作る時に最近の流行りだったらNuxt.js+FastAPIないしDjango+REST API Frameworkかなあと思ったのですが時間も手間も無いのでMTVモデルでDBをDjangoに据えてやってみた感想
Djongoとは
-
https://www.djongomapper.com/
- MongoDBでORMできるスゲーやつ
- 使い方は公式のリファレンスが簡潔にまとまっている
- PyPIでのDevelopment Statusは3(Alpha)1
- 確認時のリリースバージョンは1.3.4
- 有償サポートあり
- Discord/メール/追加機能へのアクセス
- AGPLv3ライセンス
良いと思った所
- スキーマレス
- OneToOne/OneToManyのモデルの定義に対しても良い感じに振る舞ってくれる
- Aggreation pipelineを書く手間が省ける
- JSON型のサポート2
- 何でも突っ込めるので雑に設計しても困らない
- MongoDBに依存したコード(Djongo/Pymongo実装のクラス)が少なければデータベースの変更が容易
不満が残る所
- Transactionが未サポート(
'ATOMIC_REQUESTS'=True
も効かない)- MongoDBを使う以上単一のドキュメントで処理が完結できるような設計にした方が良さそう
- 有償版なら使えるというパターン
- ModelにIndexを張ってmigrate…みたいな事が出来ない
- Modelに適当にIndexに対する定義を書いておいてCommandでスキャンしたModelの該当の箇所を読んでpymongoのcreate_index関数でIndex作成……みたいな事をするか、手動でIndexを張るクエリを発行する必要あり
- 有償版のDjongoNxtなら出来るよ!
- Modelに適当にIndexに対する定義を書いておいてCommandでスキャンしたModelの該当の箇所を読んでpymongoのcreate_index関数でIndex作成……みたいな事をするか、手動でIndexを張るクエリを発行する必要あり
-
$search
や一部クエリの未サポート- 有償版の(略)3
- AUTO_INCREMENTな採番処理はもちろん使えない4
- MTVモデルでの使われ方をあまり考慮されていない
- ObjectIdのフィールド(
_id
)をTemplateから使うにはフィールド名をゴニョるために一工夫要るとか - Djongoのフィールドとして提供されているArrayField等のいわるゆJSON型のカラムをFormに埋め込むのがメチャクチャハマる
- 基本的にやり取りはJSONで行われている前提で考えられているのでMTVモデルでDjongoを使おうと思った場合はフレームワークとライブラリの恩恵に与れない事は理解しておく必要がありそう
- ObjectIdのフィールド(
- シャーディングできない気がする
- Modelにそういうメタデータあったらいいんだけど
- コミュニティが弱い
結論
プロトタイピングなら最適。
-
https://www.djongomapper.com/using-django-with-other-fields/#the-list-field ↩
-
どうしても必要なときはPymongoの
find_one_and_update
で採番テーブルからインクリメントされた値を取るような実装を自分で書く必要があるhttps://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html?highlight=find_one_and_update#pymongo.collection.Collection.find_one_and_update ↩ -
https://github.com/nesdis/djongo/issues/491#issuecomment-720131080 ↩
-
https://github.com/nesdis/djongo/issues/444#issuecomment-662860814 ↩