Haben Sie darüber nachgedacht, PyMongo direkt zu verwenden, anstatt Mongoengine zu verwenden? Mongoengine wurde entwickelt, um ein Schema für Ihre Dokumente zu deklarieren und zu validieren, und bietet viele Tools und Annehmlichkeiten in diesem Zusammenhang. Wenn Ihre Dokumente variieren werden, bin ich mir nicht sicher, ob Mongoengine die richtige Wahl für Sie ist.
Wenn Sie jedoch einige Felder in allen Dokumenten gemeinsam haben und dann jedes Dokument eine Reihe von Feldern hat, die für sich selbst spezifisch sind, können Sie DictField
von Mongoengine verwenden . Der Nachteil dabei ist, dass die Schlüssel nicht "oberste Ebene" sind, zum Beispiel:
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()
Ergibt ein MongoDB-Dokument wie:
{ _id: ObjectId(...),
_types: ["UserThings"],
_cls: "UserThings",
username: "dcrosta",
things: {
foo: "bar",
baz: "quack"
}
}
Bearbeiten: Ich sollte auch anmerken, dass am Entwicklungszweig von Mongoengine für "dynamische" Dokumente gearbeitet wird, bei denen Attribute in den Python-Dokumentinstanzen gespeichert werden, wenn das Modell gespeichert wird. Siehe https://github.com/hmarr/mongoengine/pull/112 für Details und Verlauf.