English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
위의 쿼리에서 주의해야 할 것은,db
와users
각각 데이터베이스와 콜렉션입니다.
단점은, 내장 문서의 크기가 지속적으로 크게 증가하면 읽기에 영향을 미칠 수 있습니다./쓰기 성능.
이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"]}})