【发布时间】:2016-01-28 05:56:24
【问题描述】:
我的文档有一些 EmbeddedDocumentList 并且每个 EmbeddedDocument 都应该有自动生成的 ObjectId(like _id) 字段,因为我将编写查询来获取带有这个 _id 字段的单个 EmbeddedDocument。
如何做到这一点?
【问题讨论】:
标签: mongodb pymongo mongoengine
我的文档有一些 EmbeddedDocumentList 并且每个 EmbeddedDocument 都应该有自动生成的 ObjectId(like _id) 字段,因为我将编写查询来获取带有这个 _id 字段的单个 EmbeddedDocument。
如何做到这一点?
【问题讨论】:
标签: mongodb pymongo mongoengine
基本上你可以用下面的代码做到这一点
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 是生成新 objectid 的类。
此外,documentation 说默认值可以调用,而不是清楚地解释它是如何工作的。
embeddeddocument 的 _id 名称也不是最佳命名实践,因为您将为带有双下划线的嵌入式文档编写查询,并且“_id”名称还有一个下划线,如下代码所示
MyDocument.objects.get(notice___id)
然后 mongoengine 抛出异常,因为“_id”名称多了一个下划线。因此,您应该将 name 命名为 'oid' 作为 objectId 的简短版本,或者直接重命名 'id' 或您想要的名称。
【讨论】: