English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
As relações em MongoDB representam as relações lógicas entre diferentes documentos. As relações podem ser modeladas por meio de métodos de嵌入 e referência. Essa relação pode ser1:1,1:N, N:1ou N:N.
Vamos considerar o caso de armazenamento de endereços para os usuários. Portanto, um usuário pode ter vários endereços, formando assim1:N de relação.
A seguir está a estrutura de exemplo do documentouser
-
{ "_id": ObjectId("52ffc33cd85242f4361 "name": "Tom Hanks" "contact": "",987654321", "dob": "01-01-1991" }
A seguir está a estrutura de exemplo do documentoaddress
-
{ "_id": ObjectId("52ffc4a5d85242602e000000"), "building": "",22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }
No método embutido,嵌入文档 de endereço no documento de usuário.
>db.users.insert({ { "_id": ObjectId("52ffc33cd85242f4361 "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" } ] } )
Este método armazena todos os dados relacionados em um único documento, o que facilita a pesquisa e a manutenção. É possível recuperar todo o documento em uma única consulta, por exemplo-
>db.users.findOne({"name":"Tom Benzamin"},{"address":1)
Atenção na consulta acima:db
eusers
respectivamente, o banco de dados e a coleção.
A desvantagem é que, se o tamanho dos documentos anexados continuar a crescer excessivamente, pode afetar a leitura/escrevendo desempenho.
Este é o caminho para a normalização do design de relacionamento. Neste método, os documentos de usuário e os documentos de endereço serão mantidos separadamente, mas os documentos de usuário conterão um campo de referência para o campo id do documento de endereço.
{ "_id": ObjectId("52ffc33cd85242f4361 "contact": "",987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001) ] }
Como mostrado acima, o documento do usuário contém o campo array address_ids, que contém os ObjectId dos endereços correspondentes. Usando esses ObjectId, podemos consultar o documento de endereço e obter os detalhes do endereço lá. Usando esse método, precisaremos de duas consultas: primeiroaddress_ids
deuser
obter campos do documento, em seguida deaddress
Obter essas endereços na coleção.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})