如何使用mongoengine在EmbeddedDocument中定义objectid?

How to define objectid in EmbeddedDocument with mongoengine?

我的文档有一些 EmbeddedDocumentList,每个 EmbeddedDocument 都应该有自动生成的 ObjectId(如 _id)字段,因为我将编写查询以获取带有此 _id 字段的单个 EmbeddedDocument。

如何实现?

基本上你可以用下面的代码来完成

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 是生成新对象 ID 的 class。

此外 documentation 说默认值是可以调用的,而不是解释清楚它是如何工作的。

嵌入式文档的 _id 名称也不是最佳命名实践,因为您将使用双下划线编写嵌入式文档的查询,并且“_id”名称还有一个下划线,如下面的代码

MyDocument.objects.get(notice___id)

然后 mongoengine 抛出异常,因为 '_id' 名称多了一个下划线。因此,您应该将 name as 'oid' 作为 objectId 的简短版本或直接重命名 'id' 或您想要的。