【问题标题】:ReferenceField with reference to existing document参考现有文档的 ReferenceField
【发布时间】:2016-03-03 13:09:42
【问题描述】:

据我了解,mongoengine's ReferenceField 允许传递对存储在数据库中的另一个文档的引用。

到目前为止,我能够在不同的集合中创建多个文档(在本示例中减少为两个),现在我需要相互引用。

正如您将在下面看到的,我想在 regenerators 集合中创建新文档时传递给定材料的引用。在我提供的示例中,这意味着传递对文档 aisi304 的引用。

我的再生器文档定义如下:

class Regenerators(Document):
    material = ReferenceField(Materials, required=True)

材料文档需要引用再生器文档,定义如下:

class Materials(Document):
    title = StringField(unique=True, required=True)

但是,在这种情况下,所需的材料文档已经存储在数据库中:

{
    "_id": ObjectId("565b84dc55c40f63392ffdee"),
    "title": "aisi304"
}

所以我尝试创建一个新的再生器文档,如下传递要引用的材料文档的标题作为关键字参数:

# 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()

但是,由于存储在 DB 中的再生器文档看起来像这样(使用 mongod 进行调试),因此似乎没有正确传递引用:

{
    "_id": ObjectId("565b89d355c40f6355fa5f45"),
    "material": "aisi304"
}

我以为我会实现这样的目标:

{
    "_id": ObjectId("565b89d355c40f6355fa5f45"),
    "material": {
        "_id": ObjectId("565b84dc55c40f63392ffdee"),
        "title": "aisi304"
    }
}

tutorial provided in the docs 中,它们传递了对新创建文档的引用。但是,这不适合我,因为我需要参考现有的文档。

我做错了什么?

【问题讨论】:

    标签: python mongodb reference document mongoengine


    【解决方案1】:

    你做错了。您应该保存对 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()
    

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2021-03-25
      • 2023-03-20
      相关资源
      最近更新 更多