Bạn đã cân nhắc sử dụng PyMongo trực tiếp thay vì sử dụng Mongoengine chưa? Mongoengine được thiết kế để khai báo và xác thực một lược đồ cho tài liệu của bạn, đồng thời cung cấp nhiều công cụ và tiện ích xung quanh đó. Nếu tài liệu của bạn thay đổi, tôi không chắc Mongoengine là lựa chọn phù hợp cho bạn.
Tuy nhiên, nếu bạn có một số trường chung trên tất cả các tài liệu và sau đó mỗi tài liệu có một số trường cụ thể cho chính nó, bạn có thể sử dụng DictField
của Mongoengine . Nhược điểm của điều này là các khóa sẽ không phải là "cấp cao nhất", ví dụ:
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()
Kết quả trong một tài liệu MongoDB như:
{ _id: ObjectId(...),
_types: ["UserThings"],
_cls: "UserThings",
username: "dcrosta",
things: {
foo: "bar",
baz: "quack"
}
}
Chỉnh sửa: Tôi cũng nên lưu ý, nhánh phát triển của Mongoengine dành cho các tài liệu "động" đang được tiến hành, trong đó các thuộc tính trên các phiên bản tài liệu Python sẽ được lưu khi mô hình được lưu. Xem https://github.com/hmarr/mongoengine/pull/112 để biết chi tiết và lịch sử.