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

Relations MongoDB

Les relations dans MongoDB représentent les relations logiques entre différents documents. Les relations peuvent être modélisées par l'intégration et la référence. Cette relation peut être1:1,1:N, N:1ou N:N.

Considérons le cas où un utilisateur stocke des adresses. Par conséquent, un utilisateur peut avoir plusieurs adresses, ce qui forme1:N des relations.

Voici l'exemple de structure du document du documentuser-

{
   "_id": ObjectId("52ffc33cd85242f436000001")
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

Voici l'exemple de structure du document du documentaddress-

{
   "_id": ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

Créer un modèle de relation intégrée

Dans la méthode intégrée, nous intégrons le document d'adresse dans le document utilisateur.

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

Cette méthode conserve toutes les données pertinentes dans un document unique, ce qui rend la recherche et la maintenance plus faciles. Il est possible de rechercher tout le document en une seule requête, par exemple-

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

Attention dans la requête ci-dessus,dbetusersSont respectivement la base de données et l'ensemble.

Le défaut est que, si la taille des documents intégrés continue de croître de manière excessive, cela pourrait affecter la lecture/Écrire les performances.

Créer un modèle de relation de référence

C'est la méthode de conception de relation normalisée. Dans cette méthode, les documents utilisateur et les documents d'adresse sont gérés séparément, mais le document utilisateur contient un champ de référence à l'ID du document d'adresse.

{
   "_id": ObjectId("52ffc33cd85242f436000001")
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Comme indiqué ci-dessus, le document utilisateur contient un champ de tableau address_ids, qui contient les ObjectId des adresses correspondantes. Utilisant ces ObjectId, nous pouvons consulter les documents d'adresse et y obtenir des détails sur les adresses. Avec cette méthode, nous aurons besoin de deux requêtes : d'abordaddress_idsdeuserobtenir les champs du document, puis deaddressObtenir ces adresses dans la collection.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})