如何使用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' 或您想要的。
我的文档有一些 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' 或您想要的。