ReferenceField 参考现有文档
ReferenceField with reference to existing document
据我了解,mongoengine's ReferenceField 允许传递对存储在数据库中的另一个文档的引用。
到目前为止,我已经能够在不同的 collection 中创建多个文档(在此示例中减少为两个),我现在需要相互引用。
正如您将在下面看到的,我想在重新生成器 collection 中创建新文档时传递给定 material 的引用。在我提供的示例中,这意味着传递对文档 aisi304
.
的引用
我的再生器文档定义如下:
class Regenerators(Document):
material = ReferenceField(Materials, required=True)
materials文档需要引用一个regenerator文档,定义如下:
class Materials(Document):
title = StringField(unique=True, required=True)
但是,所需的 materials 文档已存储在数据库中,如本例所示:
{
"_id": ObjectId("565b84dc55c40f63392ffdee"),
"title": "aisi304"
}
所以我尝试创建一个新的再生器文档,如下所示,将要引用的 material 文档的标题作为关键字参数传递:
# the passed keywords are read from json normally, but I put it in directly for the sake of readability
r = Regenerators(material="aisi304")
r.save()
但是,引用似乎没有正确传递,因为存储在数据库中的 regernator 文档如下所示(使用 mongod 进行调试):
{
"_id": ObjectId("565b89d355c40f6355fa5f45"),
"material": "aisi304"
}
我以为我会实现这样的目标:
{
"_id": ObjectId("565b89d355c40f6355fa5f45"),
"material": {
"_id": ObjectId("565b84dc55c40f63392ffdee"),
"title": "aisi304"
}
}
在 tutorial provided in the docs 中,他们将引用传递给新创建的文档。但是,这不适合我,因为我需要参考现有文档。
我做错了什么?
你做错了。您应该保存对 Materials
对象的引用,然后将其作为参数传递给 Regenerators
演示
class Materials(Document):
title = StringField(unique=True, required=True)
class Regenerators(Document):
material = ReferenceField(Materials, required=True)
m = Materials(title='aisi304').save()
r = Regenerators(material=m).save()
那么你的文件看起来像这样:
> db.regenerators.find()
{
"_id" : ObjectId("565c9d110acf4510cf1f8712"),
"material" : ObjectId("565c9cfc0acf4510cf1f8711")
}
> db.materials.find()
{ "_id" : ObjectId("565c9cfc0acf4510cf1f8711"), "title" : "aisi304" }
>
如果您想使用对现有文档的引用,您需要使用 .get
方法发出查询,然后将其引用作为参数传递给 Regenerators
m = Materials.objects.get(title='aisi304')
r = Regenerators(material=m).save()
据我了解,mongoengine's ReferenceField 允许传递对存储在数据库中的另一个文档的引用。
到目前为止,我已经能够在不同的 collection 中创建多个文档(在此示例中减少为两个),我现在需要相互引用。
正如您将在下面看到的,我想在重新生成器 collection 中创建新文档时传递给定 material 的引用。在我提供的示例中,这意味着传递对文档 aisi304
.
我的再生器文档定义如下:
class Regenerators(Document):
material = ReferenceField(Materials, required=True)
materials文档需要引用一个regenerator文档,定义如下:
class Materials(Document):
title = StringField(unique=True, required=True)
但是,所需的 materials 文档已存储在数据库中,如本例所示:
{
"_id": ObjectId("565b84dc55c40f63392ffdee"),
"title": "aisi304"
}
所以我尝试创建一个新的再生器文档,如下所示,将要引用的 material 文档的标题作为关键字参数传递:
# the passed keywords are read from json normally, but I put it in directly for the sake of readability
r = Regenerators(material="aisi304")
r.save()
但是,引用似乎没有正确传递,因为存储在数据库中的 regernator 文档如下所示(使用 mongod 进行调试):
{
"_id": ObjectId("565b89d355c40f6355fa5f45"),
"material": "aisi304"
}
我以为我会实现这样的目标:
{
"_id": ObjectId("565b89d355c40f6355fa5f45"),
"material": {
"_id": ObjectId("565b84dc55c40f63392ffdee"),
"title": "aisi304"
}
}
在 tutorial provided in the docs 中,他们将引用传递给新创建的文档。但是,这不适合我,因为我需要参考现有文档。
我做错了什么?
你做错了。您应该保存对 Materials
对象的引用,然后将其作为参数传递给 Regenerators
演示
class Materials(Document):
title = StringField(unique=True, required=True)
class Regenerators(Document):
material = ReferenceField(Materials, required=True)
m = Materials(title='aisi304').save()
r = Regenerators(material=m).save()
那么你的文件看起来像这样:
> db.regenerators.find()
{
"_id" : ObjectId("565c9d110acf4510cf1f8712"),
"material" : ObjectId("565c9cfc0acf4510cf1f8711")
}
> db.materials.find()
{ "_id" : ObjectId("565c9cfc0acf4510cf1f8711"), "title" : "aisi304" }
>
如果您想使用对现有文档的引用,您需要使用 .get
方法发出查询,然后将其引用作为参数传递给 Regenerators
m = Materials.objects.get(title='aisi304')
r = Regenerators(material=m).save()