Создать отношения в MongoDB

Опубликовано: 30 Ноября, 2021

В MongoDB отношения представляют, как различные типы документов логически связаны друг с другом. Такие отношения, как «один-к-одному», «один-ко-многим» и т. Д., Можно представить с помощью двух разных моделей:

  1. Встроенная модель документа
  2. Эталонная модель

Модель встроенного документа: в этой модели документы встроены в один документ. Например, у нас есть два документа: один - это студент (который содержит основную информацию о студенте, такую как идентификатор, ветка имени), а другой - адресный документ (который содержит адрес студента). Таким образом, вместо создания двух разных документов мы встраиваем адресные документы в документ студента. Это поможет пользователю получить данные с помощью одного запроса, а не писать несколько запросов.

Эталонная модель: в этой модели мы ведем документы отдельно, но один документ содержит ссылки на другие документы. Например, у нас есть два документа: один - это студент (который содержит основную информацию о студенте, такую как идентификатор, ветка имени), а другой - адресный документ (который содержит адрес студента). Итак, здесь документ студента содержит ссылку на поле идентификатора адресного документа. Теперь, используя этот ссылочный идентификатор, мы можем запросить адрес и получить адрес студента. Эта модель обычно используется для построения нормализованных отношений.

Индивидуальные отношения со встроенными документами

Используя встроенные документы, мы можем создавать взаимно однозначные отношения между данными, так что мы можем легко извлекать данные, используя несколько операций чтения.

Теперь мы обсудим взаимно однозначные отношения со встроенными документами на примере. Допустим, у нас есть два документа. Первый документ содержит имя идентификатора и ветвь студента, а второй документ содержит детали постоянного адреса студента.

// Студенческий документ
{
    StudentName: GeeksA,
    StudentId: g_f_g_1209,
    Филиал: CSE
}

// Адресный документ
{
    StudentName: GeeksA,
    PremanentAddress: XXXXXXX,
    Город: Дели,
    Пин-код: 202333
}

Теперь, если адресные данные используются часто, пользователь извлекает данные адресного документа, создавая запрос с использованием имени студента, но здесь два документа содержат одно и то же поле (например, имя студента), поэтому пользователю нужно написать еще несколько запросов для получения необходимая информация. Этот процесс получения данных является громоздким. Итак, мы встроили адресный документ в студенческий документ.

 {
    StudentName: GeeksA,
    StudentId: g_f_g_1209,
    Филиал: CSE
    Постоянный адрес:{
        PremanentAddress: XXXXXXX,
        Город: Дели,
        Пин-код: 202333
    } 
}

Теперь нам нужно написать только один запрос для получения необходимых данных. Преимущество использования встроенных документов в том, что мы можем сгруппировать необходимую информацию и сохранить ее в одном документе. Так проще получить подробную информацию за один звонок. Но когда документ начинает расти, например, при добавлении академической информации, информации о легкой атлетике в вышеупомянутый документ, он становится длиннее и требует больше времени для получения деталей. Только при необходимости нам может потребоваться информация об академической или спортивной деятельности, и, следовательно, во время этих сценариев нам может потребоваться разбить документ и перейти к подмножеству шаблона . В шаблоне «Подмножество» мы разбиваем большую сумму информации на небольшие фрагменты, чтобы мы могли легко извлекать данные. Потому что большой объем данных замедляет операцию чтения. Но шаблон подмножества также имеет недостаток, заключающийся в том, что ваши данные разбиваются на множество небольших коллекций, часть обслуживания базы данных затруднена, а отслеживание данных также станет проблемой.

Пример:

Здесь мы работаем с:

Database: gfg

Collection: student

Documents: One document that contains the details of a student

Теперь отобразим адрес студента.

 db.student.find ({StudentName: "GeeksA"}, {"PermanentAddress.permaAddress": 1}). pretty ()

Отношения "один ко многим" со встроенными документами

Используя встроенные документы, мы можем создавать отношения «один ко многим» между данными, так что мы можем легко извлекать данные, используя несколько операций чтения. Теперь мы обсудим связь «один ко многим» со встроенными документами на примере. Иногда есть вероятность, что у человека есть несколько адресов, например, у него есть текущий адрес (место, где он / она живет) и адрес проживания (место, где у него / нее есть собственный дом или постоянный адрес). В течение этого времени возможны отношения от одной до многих. Итак, мы можем использовать встроенную модель документа для хранения постоянного и текущего адреса в одном документе.

 // Студенческий документ
{
    StudentName: GeeksA,
    StudentId: g_f_g_1209,
    Филиал: CSE
}

// Документ с постоянным адресом
{
    StudentName: GeeksA,
    Постоянный адрес: XXXXXXX,
    Город: Дели,
    Пин-код: 202333
}

// Текущий адрес документа
{
    StudentName: GeeksA,
    CurrentAddress: XXXXXXX,
    Город: Мумбаи,
    Пин-код: 334509
}

Теперь вместо того, чтобы писать три документа, мы можем объединить их в один документ.

 // Студенческий документ
{
    StudentName: GeeksA,
    StudentId: g_f_g_1209,
    Филиал: CSE
    Адрес: [
    {
        StudentName: GeeksA,
        Постоянный адрес: XXXXXXX,
        Город: Дели,
        Пин-код: 202333
    },
    {
        StudentName: GeeksA,
        CurrentAddress: XXXXXXX,
        Город: Мумбаи,
        Пин-код: 334509
    }
    ]
}

Поскольку мы храним все данные (даже если существует более двух типов адресной информации, мы можем хранить их в массиве JSON) в одной коллекции, мы можем запросить за один вызов и получить весь набор данных, что приводит к для получения полной информации и без потерь.

Пример:

Здесь мы работаем с:

Database: gfg

Collection: student

Documents: One document that contains the details of a student

Теперь отобразим все адреса студента.

 db.student.find ({StudentName: "GeeksA"},
                {"Address.permaAddress": 1,
                 "Address.currAddress": 1}). Pretty ()

Отношения "один ко многим" со ссылкой на документ

Мы также можем установить связь «один ко многим», используя ссылочную модель документа. В этой модели мы ведем документы отдельно, но один документ содержит ссылки на другие документы.

Теперь мы обсудим связь «один ко многим» со встроенными документами на примере. Допустим, у нас есть учитель, который преподает в двух разных классах. Итак, у нее есть три документа:

 // Учительский документ
{
    имя: Сунита,
    TeacherId: g_f_g_1209,
}

// Документ класса 1
{
    TeacherId: g_f_g_1209,
    Имя класса: GeeksA,
    ClassId: C_123
    Кол-во студентов: 23,
    Тема: «Наука»,
}

// Документ класса 2
{
    TeacherId: g_f_g_1209,
    ClassId: C_234
    Имя класса: GeeksB,
    Кол-во студентов: 33,
    Тема: «Математика»,
}

Теперь получение данных из этих разных документов обременительно. Итак, здесь мы используем эталонную модель, которая поможет учителю извлекать данные с помощью одного запроса.

 // Учительский документ
{
    имя: Сунита,
    TeacherId: g_f_g_1209,
    classIds: [
    С_123,
    C_234
    ]
}

Теперь, используя эти поля classIds, учитель может легко получить данные классов 1 и 2.

Пример:

Здесь мы работаем с:

Database: gfg

Collection: teacher

Documents: three document that contains the details of the classes

Теперь выведем значения поля classId

 db.teacher.findOne ({имя: "Сунита"}, {classId: 1})