我的文档有一些EmbeddedDocumentList,每个EmbeddedDocument都应该有自动生成的ObjectId(如_id)字段,因为我会编写查询来获取带有此_id字段的单个EmbeddedDocument。
如何达到目标?
答案 0 :(得分:4)
基本上你可以使用以下代码
来完成from mongoengine import *
from bson.objectid import ObjectId
class MyEmbeddedDocument(EmbeddedDocument):
oid = ObjectIdField(required=True, default=ObjectId,
unique=True, primary_key=True)
...
class MyDocument(Document):
embedded_list = EmbeddedDocumentListField(MyEmbeddedDocument)
...
让我们解释一下,
根据documentation,您可以将ObjectIdField添加到模型中,但不需要它和primary_key,那么您应该将此属性设置为True。此外,它不为每个生成ObjectId然后导入并将其默认设置为ObjectId。
最后一步有点棘手。如果需要解释,
bson.objectid.ObjectId是生成新对象的类。
此外documentation表示默认值可以调用,而不清楚它是如何工作的。
嵌入式文档的_id名称也不是最佳命名实践,因为您将使用duble下划线和' _id'来编写嵌入式文档的查询。 name还有一个下划线,如下面的代码
MyDocument.objects.get(notice___id)
然后,mongoengine抛出异常,因为' _id' name还有一个下划线。因此,您应该将姓名命名为' oid'作为objectId的简短版本或者renname' id'直接或你想要的。