【问题标题】:How to define objectid in EmbeddedDocument with mongoengine?如何使用 mongoengine 在 EmbeddedDocument 中定义 objectid?
【发布时间】:2016-01-28 05:56:24
【问题描述】:

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

如何做到这一点?

【问题讨论】:

    标签: mongodb pymongo mongoengine


    【解决方案1】:

    基本上你可以用下面的代码做到这一点

    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' 或您想要的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多