Czy rozważałeś bezpośrednie użycie PyMongo zamiast Mongoengine? Mongoengine został zaprojektowany do deklarowania i sprawdzania poprawności schematu dla twoich dokumentów i zapewnia wiele narzędzi i udogodnień wokół tego. Jeśli twoje dokumenty będą się różnić, nie jestem pewien, czy Mongoengine jest dla ciebie właściwym wyborem.
Jeśli jednak masz pewne pola wspólne we wszystkich dokumentach, a każdy dokument ma jakiś zestaw pól specyficznych dla siebie, możesz użyć DictField
Mongoengine . Wadą tego jest to, że klucze nie będą „najwyższego poziomu”, na przykład:
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()
Wyniki w dokumencie MongoDB, takim jak:
{ _id: ObjectId(...),
_types: ["UserThings"],
_cls: "UserThings",
username: "dcrosta",
things: {
foo: "bar",
baz: "quack"
}
}
Edytuj: Powinienem również zauważyć, że trwają prace nad gałęzią rozwoju Mongoengine dla dokumentów „dynamicznych”, gdzie atrybuty instancji dokumentów Pythona zostaną zapisane podczas zapisywania modelu. Zobacz https://github.com/hmarr/mongoengine/pull/112 po szczegóły i historię.