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

Muh*_*lik 2 mongodb pymongo mongoengine

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

如何达到?

Muh*_*lik 5

基本上,您可以使用以下代码

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)
    ...
Run Code Online (Sandbox Code Playgroud)

让我们解释更多,

根据文档,您可以将ObjectIdField添加到模型中,但这不是必需的,并且primary_key然后应将此属性设置为True。另外,它不会为每个对象生成ObjectId,然后导入并将其默认设置为ObjectId。

最后一步有些棘手。如果需要说明,

bson.objectid.ObjectId是生成新的objectid的类。

此外,文档还说默认值是可以调用的,因此可以清楚地说明它是如何工作的。

另外,针对Embeddeddocument的_id名称也不是最佳命名方式,因为您将对带有下划线的EmbeddedDocument编写查询,并且'_id'名称还有一个下划线,如下所示

MyDocument.objects.get(notice___id)
Run Code Online (Sandbox Code Playgroud)

然后mongoengine抛出异常,因为'_id'名称再加上一个下划线。因此,您应该将name作为“ oid”作为objectId的简称,或者直接将name命名为“ id”或您想要的名称。