English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Relacionamento MongoDB

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

Modelo de relação embutida

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:dbeusersrespectivamente, 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.

Modelo de relação de referência

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_idsdeuserobter campos do documento, em seguida deaddressObter 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"]}})