Допустим, у меня есть 3 типа объектов: Животное, Собакаи Пудель. Я хочу сохранить данные в этих объектах как документы в mongodb.

Допустим, мой документ для Животное выглядит так:

{
    "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. Я бы предпочел не изобретать велосипед, поэтому, если эта проблема решалась раньше (что, как я подозреваю, имеет), я был бы признателен, если бы кто-то направил меня к решениям, которые придумали другие люди. Спасибо.

Loktopus

Ответов: 1

Ответы (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.

2022 WebDevInsider