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

MongoDB 관계

MongoDB에서 관계는 다른 문서 간의 논리적 관계를 나타냅니다. 관계는 내장 및 참조 방법으로 모델링될 수 있습니다. 이 관계는 다음과 같습니다.1:1,1:N, N:1또는 N:N 관계를 형성합니다.

사용자의 주소를 저장하는 경우를 고려해 보겠습니다. 따라서 한 사용자는 여러 개의 주소를 가질 수 있으며, 이는1:N 관계.

아래는 문서의 예제 문서 구조입니다user-

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

아래는 문서의 예제 문서 구조입니다address-

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

내장 관계 모델 구축

내장 방법에서는 주소 문서를 사용자 문서에 내장합니다.

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

이 방법은 모든 관련 데이터를 하나의 문서에 저장하여 검색 및 유지가 더 쉬워집니다. 전체 문서를 단일 쿼리로 검색할 수 있습니다. 예를 들어,-

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

위의 쿼리에서 주의해야 할 것은,dbusers각각 데이터베이스와 콜렉션입니다.

단점은, 내장 문서의 크기가 지속적으로 크게 증가하면 읽기에 영향을 미칠 수 있습니다./쓰기 성능.

참조 관계 모델 구축

이Normalize된 관계 설계 방법은 여기서 사용됩니다. 이 방법에서는 사용자 문서와 주소 문서가 별도로 유지되지만, 사용자 문서는 주소 문서 id 필드에 참조를 포함합니다.

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

위와 같이, 사용자 문서는 배열 필드 address_ids를 포함하고 있으며, 이는 해당 주소의 ObjectId를 포함하고 있습니다. 이 ObjectId를 사용하여 주소 문서를 쿼리하고 주소 세부 정보를 가져올 수 있습니다. 이 방법을 사용하면 두 번의 쿼리가 필요합니다: 먼저address_ids에서user문서에서 필드를 가져온 후, 다음으로address집합에서 이러한 주소를 가져옵니다。

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