Отношения в MongoDB представляют, как различные документы логически связаны друг с другом. Отношения могут быть смоделированы с помощью встроенного и ссылочного подходов. Такими отношениями могут быть 1: 1, 1: N, N: 1 или N: N.
Рассмотрим случай хранения адресов для пользователей. Таким образом, один пользователь может иметь несколько адресов, что делает это отношение 1: N.
Ниже приведен пример структуры документа пользовательского документа.
{ "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Hanks", "contact": "987654321", "dob": "01-01-1991" }
Ниже приведен пример структуры документа адресного документа —
{ "_id":ObjectId("52ffc4a5d85242602e000000"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }
Моделирование встроенных отношений
Во встроенном подходе мы будем встраивать адресный документ в пользовательский документ.
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address": [ { "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }, { "building": "170 A, Acropolis Apt", "pincode": 456789, "city": "Chicago", "state": "Illinois" } ] }
При таком подходе все связанные данные хранятся в одном документе, что облегчает извлечение и обслуживание. Весь документ может быть получен в одном запросе, например:
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Обратите внимание, что в приведенном выше запросе db и users являются базой данных и коллекцией соответственно.
Недостаток заключается в том, что если размер внедренного документа слишком велик, это может повлиять на производительность чтения / записи.
Моделирование ссылочных отношений
Это подход проектирования нормализованных отношений. При таком подходе документы пользователя и адреса будут храниться отдельно, но документ пользователя будет содержать поле, которое будет ссылаться на поле идентификатора документа адреса.
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] }
Как показано выше, пользовательский документ содержит поле массива address_ids, которое содержит ObjectIds соответствующих адресов. Используя эти ObjectIds, мы можем запросить адресные документы и получить оттуда подробную информацию об адресе. При таком подходе нам понадобятся два запроса: первый для извлечения полей address_ids из пользовательского документа, а второй — для извлечения этих адресов из коллекции адресов .