Mongoengineを使用する代わりにPyMongoを直接使用することを検討しましたか? Mongoengineは、ドキュメントのスキーマを宣言および検証するように設計されており、その周りに多くのツールと便利さを提供します。ドキュメントが変わる場合は、Mongoengineが正しい選択かどうかはわかりません。
ただし、すべてのドキュメントに共通のフィールドがあり、各ドキュメントに固有のフィールドのセットがある場合は、MongoengineのDictField
を使用できます。 。これの欠点は、たとえば、キーが「トップレベル」にならないことです。
class UserThings(Document):
# you can look this document up by username
username = StringField()
# you can store whatever you want here
things = DictField()
dcrosta_things = UserThings(username='dcrosta')
dcrosta_things.things['foo'] = 'bar'
dcrosta_things.things['bad'] = 'quack'
dcrosta_things.save()
結果は次のようなMongoDBドキュメントになります:
{ _id: ObjectId(...),
_types: ["UserThings"],
_cls: "UserThings",
username: "dcrosta",
things: {
foo: "bar",
baz: "quack"
}
}
編集: また、「動的」ドキュメント用のMongoengineの開発ブランチで進行中の作業があり、モデルが保存されるときにPythonドキュメントインスタンスの属性が保存されることにも注意してください。 https://github.com/hmarr/mongoengine/pull/112 を参照してください 詳細と歴史について。