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"]}})