Har du funderat på att använda PyMongo direkt istället för att använda Mongoengine? Mongoengine är utformad för att deklarera och validera ett schema för dina dokument, och tillhandahåller många verktyg och bekvämligheter kring det. Om dina dokument kommer att variera är jag inte säker på att Mongoengine är rätt val för dig.
Om du däremot har några fält gemensamma för alla dokument, och varje dokument har en uppsättning fält som är specifika för sig själv, kan du använda Mongoengines DictField
. Nackdelen med detta är att nycklarna inte kommer att vara "top-level", till exempel:
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()
Resultat i ett MongoDB-dokument som:
{ _id: ObjectId(...),
_types: ["UserThings"],
_cls: "UserThings",
username: "dcrosta",
things: {
foo: "bar",
baz: "quack"
}
}
Redigera: Jag bör också notera att det pågår arbete med utvecklingsgrenen av Mongoengine för "dynamiska" dokument, där attribut på Python-dokumentinstanserna kommer att sparas när modellen sparas. Se https://github.com/hmarr/mongoengine/pull/112 för detaljer och historik.