MongoDB - Relacionamentos
Os relacionamentos no MongoDB representam como vários documentos estão logicamente relacionados entre si. Relacionamentos podem ser modelados viaEmbedded e Referencedabordagens. Essas relações podem ser 1: 1, 1: N, N: 1 ou N: N.
Vamos considerar o caso de armazenamento de endereços para usuários. Portanto, um usuário pode ter vários endereços, tornando este um relacionamento 1: N.
A seguir está a estrutura do documento de amostra de user documento -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
A seguir está a estrutura do documento de amostra de address documento -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
Modelando Relacionamentos Embutidos
Na abordagem embutida, iremos embutir o documento de endereço dentro do documento do usuário.
> db.users.insert({
{
"_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"
}
]
}
})
Essa abordagem mantém todos os dados relacionados em um único documento, o que facilita a recuperação e a manutenção. Todo o documento pode ser recuperado em uma única consulta, como -
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Observe que na consulta acima, db e users são o banco de dados e a coleção, respectivamente.
A desvantagem é que, se o documento incorporado continuar crescendo muito, pode afetar o desempenho de leitura / gravação.
Modelando Relacionamentos Referenciados
Esta é a abordagem para projetar relacionamento normalizado. Nesta abordagem, os documentos de usuário e endereço serão mantidos separadamente, mas o documento do usuário conterá um campo que fará referência ao documento de endereçoid campo.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Conforme mostrado acima, o documento do usuário contém o campo array address_idsque contém ObjectIds de endereços correspondentes. Usando esses ObjectIds, podemos consultar os documentos de endereço e obter detalhes de endereço a partir deles. Com esta abordagem, precisaremos de duas consultas: primeiro, para buscar oaddress_ids campos de user documento e segundo para buscar esses endereços de address coleção.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})