如何在mongodb中最好地存储有关继承的信息?

时间:2016-01-01 21:21:36

标签: mongodb inheritance orm

我们说我有3种类型的对象:AnimalDogPoodle。我想将这些对象中的数据存储为mongodb中的文档。

让我们说Animal的文档如下:

{
    "name": ...
}

Dog的文档如下:

{
    "name": ...,
    "barkFile": ...
}

我的Poodle文档看起来像是:

{
    "name": ...,
    "barkFile": ...,
    "haircut": ...
}

在查找有关存储不同类型对象的建议时,几乎每个人似乎都会说使用类型字段。这适用于不同类型的动物,如:

{
    "_type": "cat",
    "name": ...,
    "meowFile": ...
}

{
    "_type": "dog",
    "name": ...,
    "barkFile": ...
}

但它不允许我存储3级继承。基本上我想做这样的事情:

doc1 = {
    "_type": "animal",
    "name": ...
}

doc2 = {
    "_type": "animal.dog",
    "name": ...,
    "barkFile": ...
}

doc3 = {
    "_type": "animal.dog.poodle",
    "name": ...,
    "barkFile": ...,
    "haircut": ...
}

我不想这样做,因为我希望能够像db.animals.find({type: 'animal.dog'})这样做,同时获得doc2和doc3。我宁愿不重新发明轮子,所以如果之前已经处理过这个问题(我怀疑它已经存在),我会感谢有人指导我做出其他人想出的解决方案。感谢。

1 个答案:

答案 0 :(得分:1)

您可以将类型和子类型存储在数组中,如下所示:

doc1 = {
    "_type": ["animal"],
    "name": ...
}

doc2 = {
    "_type": ["animal","dog"],
    "name": ...,
    "barkFile": ...
}

doc3 = {
    "_type": ["animal","dog","poodle"],
    "name": ...,
    "barkFile": ...,
    "haircut": ...
}

使用此模型,查询db.data.find({_type:"dog"})将返回doc2和doc3。