如何用mongoengine定义EmbeddedDocument中的objectid?

时间:2015-10-28 12:43:52

标签: mongodb pymongo mongoengine

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

如何达到目标?

1 个答案:

答案 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'直接或你想要的。