Обмисляли ли сте да използвате PyMongo директно вместо да използвате Mongoengine? Mongoengine е проектиран да декларира и валидира схема за вашите документи и предоставя много инструменти и удобства около това. Ако вашите документи ще се различават, не съм сигурен, че Mongoengine е правилният избор за вас.
Ако обаче имате някои общи полета във всички документи и след това всеки документ има някакъв набор от полета, специфични за себе си, можете да използвате DictField
на Mongoengine . Недостатъкът на това е, че ключовете няма да бъдат "от най-високо ниво", например:
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 за подробности и история.