MongoDB - Relationships


It represents how several types of documents are logically related to each other. The relationship can be pattern via embedded and referenced approaches like  1:1, 1: N, N: 1 or N: N.

We will consider the example of storing addresses for users. Suppose one user can have multiple addresses making this a 1:N relationship.
Following is the sample document structure of user document:

{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "name": "Dilip",
   "contact": "987654321",
   "dob": "01-01-1991"
}


given below  is the sample document structure of address document:

{
   "_id":ObjectId("52ffc4a5d85242602e000054"),
   "building": "22 A",
   "pincode": 123456,
   "city": "Delhi",
   "state": "Delhi"
}


Modeling Embedded Relationships
In this approach, we will set the address document inside the user document.


{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Dilip",
   "address": [
      {
         "building": "E-234",
         "pincode": 110096,
         "city": "Delhi",
         "state": "Delhi"
      },
      {
         "building": "A-24",
         "pincode": 203201,
         "city": "Noida",
         "state": "UP"
      }]
}


Embedded maintains all the related data in a single document which makes it easy to recover and maintain. The entire document can be recovered in a single query like this:


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


Guys, please note down that in the above query, db, and users are the database and collection respectively.
In this process, if the embedded document keeps on growing too much in size, it will impact the read/write performance.

Modeling Referenced Relationships
It is the main process of designing a normalized relationship. In this relationship, both the user and address documents will be maintained separately but the user the document will contain a field that will reference the address document's id field.


{
   "_id":ObjectId("52mmm33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Dilip",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000054"),
      ObjectId("52ffc4a5d85242602e000456")
   ]
}


As above, the user document contains the array field address_ids which contains ObjectIds of corresponding addresses. Using these ObjectIds, we can query the address documents and get address details from there. With this approach, we will need two queries: first to fetch the address_ids fields from user document and second to fetch these addresses from address collection.



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

No comments:

Post a Comment

Please do not enter any spam link in the comment box.

NUnit : Introduction

There are several unit test tools in the market, but one of them is NUnit, the most popular tool for doing unit testing. So in this tutorial...