如何在 Python 中为递归对象创建 Mongo 文档模式?
Posted
技术标签:
【中文标题】如何在 Python 中为递归对象创建 Mongo 文档模式?【英文标题】:How to create a Mongo Document Schema for a Recursive Object in Python? 【发布时间】:2020-03-11 15:27:54 【问题描述】:自引用 Python 对象 MongoDB 架构
我想达到什么目的?
我正在尝试创建的程序处理描述杂货产品类别的数据,例如:牛奶、牛肉、玉米、本地水果等。我计划将此数据存储在 MongoDB 实例中,因此创建一个 schema 会很好。
我的问题的原因是类别有子类别(乳制品:牛奶、奶酪、酸奶;肉类:牛肉、猪肉等),导致递归对象。
单独使用 Python
我在 *** 上查看了如何在 Python 中处理此类结构。
class Category():
def _init_(self, name, amount, subcategories = ()):
self.name = name
self.amount = amount
for subcategory in subcategories:
assert isinstance(subcategory, Category)
self.subcategories = subcategories
这似乎是正确的......
架构部分
...但直到我尝试将其绑定到架构中:
class Category(mongoengine.EmbeddedDocument):
def _init_(self, name, amount, subcategories = ()):
self.name = name
self.amount = amount
for subcategory in subcategories:
assert isinstance(subcategory, Category)
self.subcategories = subcategories
name = mongoengine.StringField(required=True)
amount = mongoengine.FloatField(required=True)
subcategories = mongoengine.EmbeddedDocumentListField(Category, default=None)
meta =
'db_alias': 'core',
'collection': 'category',
'indexes': [
'name',
'amount',
'subcategories',
],
'ordering': ['-name']
运行此代码会导致错误:
subbcategories = mongoengine.EmbeddedDocumentListField(Category, default=None) NameError: name 'Category' is not defined
我尝试引用父类别,而不是嵌入子类别:
parent_category = mongoengine.ObjectIdField(Category, default=None)
但我仍然收到完全相同的错误消息:
parent_category = mongoengine.ObjectIdField(Category, default=None)NameError: name 'Category' is not defined
问题本身
我应该如何为这样的递归对象定义模式?有可能吗?
【问题讨论】:
【参考方案1】:您可以尝试在此行中使用 str 'Category'
而不是输入 Category
:
subcategories = mongoengine.EmbeddedDocumentListField('Category', default=None)
EmbeddedDocumentListField 使用EmbeddedDocument
进行初始化。
EmbeddedDocument接受字符串。
【讨论】:
以上是关于如何在 Python 中为递归对象创建 Mongo 文档模式?的主要内容,如果未能解决你的问题,请参考以下文章
你可以在 Mongo 中为 $addToSet 指定一个键吗?