Ví dụ về mối quan hệ một đến nhiều mongodb

Vấn đề là bạn chuẩn hóa quá mức dữ liệu của mình. Một đơn đặt hàng được xác định bởi một khách hàng, sống ở một địa điểm nhất định tại một thời điểm nhất định, trả một mức giá nhất định có hiệu lực tại thời điểm đặt hàng (giá này có thể thay đổi nhiều trong thời gian tồn tại của ứng dụng và dù sao thì bạn cũng phải ghi lại và một số . Vì vậy, để ghi lại một đơn đặt hàng (ý định chơi chữ), bạn cần duy trì tất cả dữ liệu cho thời điểm nhất định đó. Tôi sẽ cho bạn một ví dụ

{ _id: "order123456789",
  date: ISODate("2014-08-01T16:25:00.141Z"),
  customer: ObjectId("53fb38f0040980c9960ee270"),
  items:[ ObjectId("53fb3940040980c9960ee271"),
          ObjectId("53fb3940040980c9960ee272"),
          ObjectId("53fb3940040980c9960ee273")
         ],
 Total:400
 }

Bây giờ, miễn là khách hàng cũng như chi tiết của các mặt hàng không thay đổi, bạn có thể sao chép nơi đơn hàng này được gửi đến, giá trên đơn hàng là bao nhiêu và giống nhau. Nhưng bây giờ điều gì sẽ xảy ra nếu khách hàng thay đổi địa chỉ của nó? . Sẽ dễ dàng hơn và đủ hiệu quả để lưu trữ đơn hàng như

{
  _id: "order987654321",
  date: ISODate("2014-08-01T16:25:00.141Z"),
  customer: {
               userID: ObjectId("53fb3940040980c9960ee283"),
               recipientName: "Foo Bar"
               address: {
                          street: "742 Evergreen Terrace",
                          city: "Springfield",
                          state: null
                         }
            },
  items: [
    {count:1, productId:ObjectId("53fb3940040980c9960ee300"), price: 42.00 },
    {count:3, productId:ObjectId("53fb3940040980c9960ee301"), price: 0.99},
    {count:5, productId:ObjectId("53fb3940040980c9960ee302"), price: 199.00}
  ]
}

Với mô hình dữ liệu này và việc sử dụng các đường ống tổng hợp, bạn có một số lợi thế

  1. Bạn không cần phải theo dõi độc lập giá cả và địa chỉ hoặc thay đổi tên hoặc mua quà tặng của khách hàng - nó đã được ghi lại
  2. Sử dụng các quy trình tổng hợp, bạn có thể tạo xu hướng giá mà không cần lưu trữ dữ liệu giá một cách độc lập. Bạn chỉ cần lưu trữ giá hiện tại của một mặt hàng trong một tài liệu đặt hàng
  3. Ngay cả các tập hợp phức tạp như độ co giãn giá, doanh thu theo tiểu bang / thành phố, v.v. cũng có thể được thực hiện bằng cách sử dụng các tập hợp khá đơn giản

Nói chung, có thể nói rằng trong cơ sở dữ liệu hướng tài liệu, mọi thuộc tính hoặc trường có thể thay đổi trong tương lai và thay đổi này sẽ tạo ra một ý nghĩa ngữ nghĩa khác nên được lưu trữ bên trong tài liệu. Mọi thứ có thể thay đổi trong tương lai nhưng không liên quan đến ý nghĩa ngữ nghĩa (mật khẩu người dùng trong ví dụ) có thể được liên kết thông qua GUID

Một đến nhiều mối quan hệ với mongoDB có thể dễ dàng được ánh xạ bằng mongoose. Mặc dù MongoDB không phải là cơ sở dữ liệu quan hệ như PostgreSQL, nhưng bạn vẫn có thể tạo các mối quan hệ được nhúng hoặc được tham chiếu. Các mối quan hệ được tham chiếu gần giống với các mối quan hệ sử dụng trong cơ sở dữ liệu quan hệ

Trước tiên, hãy xác định hai Lược đồ mà chúng ta sẽ thực hiện. Giả sử một chiếc ô tô thuộc về một người dùng và một người dùng có nhiều ô tô. Do đó, các lược đồ sẽ trông như thế này

Lược đồ người dùng

Lược đồ người dùng có trường tên, trường tuổi (mặc dù ở định dạng chuỗi, cũng có thể sử dụng Số) và cả mảng ô tô. Những chiếc xe thuộc loại cầy mangut. Lược đồ. các loại. ObjectID, chứa đầy ID duy nhất của các đối tượng khác. Tham chiếu biểu thị đối tượng (hoặc ô tô) nằm trong bộ sưu tập nào. Đây là một mảng, có nghĩa là người dùng có khả năng có NHIỀU ô tô

Sơ đồ xe trông như sau

lược đồ ô tô

Không giống như mô hình Người dùng, mô hình Ô tô không sở hữu một mảng Chủ sở hữu, thay vào đó, trường chủ sở hữu của nó trỏ đến một ObjectID duy nhất trong bộ sưu tập Người dùng

Bây giờ hãy xem cách chúng ta có thể truy vấn Người dùng và xem tất cả ô tô của người đó hoặc truy vấn ô tô và cũng có thể xem người dùng của nó

Bộ điều khiển người dùng

Trong User controller, chúng ta có các phương thức cơ bản để tìm một xe cụ thể (find), lấy tất cả xe (all) và tạo xe mới (create). Tuy nhiên, có một phương thức getAllCars tìm người dùng theo tên của họ (nằm trong thông số), sau đó điền vào trường ô tô của nó. Hãy xem máy chủ chính của chúng tôi. js để xem các tuyến có sẵn trước

Khi chúng tôi thực hiện yêu cầu GET tới /users/. tên người dùng/ô tô, chúng tôi sẽ được chào đón bởi

Do phương thức populate, chúng tôi có thể truy xuất một mảng của tất cả các đối tượng xe hơi, thay vì chỉ ObjectID của chúng. Đó là một mối quan hệ một-nhiều đơn giản

Mối quan hệ thực thi tính toàn vẹn dữ liệu trong cơ sở dữ liệu quan hệ. Tuy nhiên, không có mối quan hệ nào giữa các tài liệu trong MongoDB và các cơ sở dữ liệu NoSQL khác. Kết quả là, các tài liệu được khép kín. Có một số cách tiếp cận khác nhau để mô hình hóa các mối quan hệ tài liệu này.  

using data relationship in MongoDBMongoDB Mối quan hệ là đại diện cho cách nhiều tài liệu được kết nối logic với nhau trong MongoDB. Các phương thức Embedded và Referenced là hai cách để tạo các mối quan hệ như vậy. Mối quan hệ nhúng và Mối quan hệ tham chiếu tài liệu là hai loại mối quan hệ có các cách làm việc khác nhau với tài liệu.  

Trong khi Embedded là lý tưởng cho các mối quan hệ một-một và một-nhiều, thì Referenced là lý tưởng cho mối quan hệ nhiều-nhiều. Không chuẩn hóa, được nhúng, trong khi Chuẩn hóa là tên được đặt cho các mối quan hệ Tham chiếu. Thiết lập mối quan hệ giữa các tài liệu có thể hỗ trợ tinh chỉnh cấu trúc cơ sở dữ liệu, cũng như cải thiện hiệu suất và giảm thời gian thực hiện. Để tìm hiểu thêm về sự phát triển, hãy xem khóa học FSD.    

Mô hình tài liệu nhúng.  

Các tài liệu được nhúng vào nhau trong mô hình này. Chẳng hạn, chúng tôi có hai tài liệu. một là tài liệu sinh viên (chứa thông tin cơ bản của sinh viên như id và chi nhánh) và tài liệu kia là tài liệu địa chỉ (chứa địa chỉ của sinh viên). Kết quả là, thay vì tạo hai tài liệu riêng biệt, tài liệu địa chỉ được nhúng trong tài liệu sinh viên. Nó sẽ hỗ trợ người dùng truy xuất dữ liệu bằng một truy vấn duy nhất thay vì một loạt truy vấn

Mô hình tham chiếu.  

Chúng tôi giữ các tài liệu riêng biệt trong mô hình này, nhưng một tài liệu chứa các tham chiếu đến các tài liệu khác. Chẳng hạn, chúng tôi có hai tài liệu. một là tài liệu sinh viên (chứa thông tin cơ bản của sinh viên như id và chi nhánh) và tài liệu kia là tài liệu địa chỉ (chứa địa chỉ của sinh viên). Do đó, trường id của tài liệu địa chỉ được tham chiếu trong tài liệu sinh viên. Bây giờ chúng ta có thể truy vấn địa chỉ và lấy địa chỉ của học sinh bằng cách sử dụng id tham chiếu này. Các mối quan hệ chuẩn hóa thường được thiết kế bằng mô hình này

Mối quan hệ một đối một(1. 1)

Mối quan hệ cơ bản nhất trong tất cả các mối quan hệ là mối quan hệ một đối một. Nếu chúng ta có tài liệu một cha và một con, thì đó là một ví dụ về mối quan hệ một đối một.  

Thí dụ.  

Xem xét tình huống sau. chúng tôi có hai tài liệu. Tài liệu đầu tiên chứa tên id và chi nhánh của sinh viên, trong khi tài liệu thứ hai chứa thông tin địa chỉ thường trú của sinh viên.  

// Student document 
{ 
    StudentName: Ishan, 
    StudentId: k_hut_2022, 
    Branch:CSE 
} 
 
// Address document 
{ 
    StudentName: Ishan, 
    PremanentAddress: XXXXXXX, 
    City: Jaipur, 
    PinCode:302022 
} 

Nếu dữ liệu địa chỉ được sử dụng thường xuyên, người dùng sẽ tạo truy vấn bằng Tên sinh viên để truy xuất dữ liệu từ tài liệu địa chỉ. Tuy nhiên, vì hai tài liệu chứa cùng một trường (i. e. , StudentName), người dùng phải viết thêm một số truy vấn để lấy thông tin cần thiết. Quy trình truy xuất dữ liệu này tốn nhiều thời gian. Do đó, tài liệu địa chỉ đã được nhúng vào tài liệu sinh viên.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 

Để lấy dữ liệu cần thiết, bây giờ chúng ta chỉ cần viết một truy vấn duy nhất. Lợi ích của việc sử dụng tài liệu nhúng là chúng ta có thể nhóm các thông tin cần thiết vào một tài liệu duy nhất. Do đó, việc nhận thông tin chi tiết trong một cuộc gọi trở nên dễ dàng hơn. Tuy nhiên, khi tài liệu mở rộng kích thước, chẳng hạn như bằng cách thêm thông tin về học thuật và thể thao vào tài liệu trên, thì việc truy xuất thông tin sẽ trở nên lâu hơn và mất nhiều thời gian hơn. Chúng tôi có thể chỉ cần thông tin về học tập hoặc thể thao khi được yêu cầu và trong những trường hợp đó, chúng tôi có thể cần chia nhỏ tài liệu và sử dụng một mẫu tập hợp con.  

Bây giờ, chúng ta sẽ tạo một Cơ sở dữ liệu có tên ‘Knowledgehut’ và một bộ sưu tập có tên ‘student’.  

db.student.insert({"StudentName":"Ishan","StudentId":"k_hut_2022","Branch":"CSE","PermanentAddress":{"permaAddress":"xxxxxxxx","City":"Jaipur","PinCode":302022}}) 

Bạn có thể kiểm tra các tài liệu trong cơ sở dữ liệu với.  

db.student.find().pretty() 
Data Relationships in MongoDB – A quick guide

Bây giờ chúng ta sẽ kiểm tra địa chỉ của học sinh.

db.student.find({StudentName:"Ishan"},{"PermanentAddress.permaAddress":1}).pretty() 
Data Relationships in MongoDB – A quick guide

Mối quan hệ một-nhiều (1. N) 

Một tài liệu gốc có nhiều tài liệu con là một ví dụ về mối quan hệ một-nhiều. Nó tương tự như một đối một, nhưng với một số lượng lớn các tài liệu "con". Sử dụng phương pháp nhúng để thiết lập mối quan hệ có thể giảm số lượng thao tác đọc cần thiết để truy xuất dữ liệu.  

Mối quan hệ một-nhiều với Tài liệu nhúng

Thí dụ.  

Chúng tôi có thể tạo mối quan hệ một-nhiều giữa dữ liệu bằng tài liệu được nhúng, cho phép chúng tôi truy xuất dữ liệu nhanh chóng với một vài thao tác đọc. Với sự trợ giúp của một ví dụ, bây giờ chúng ta sẽ thảo luận về mối quan hệ một-nhiều với các tài liệu được nhúng.   

Một người có thể có nhiều địa chỉ, chẳng hạn như địa chỉ hiện tại (địa điểm mà người đó hiện đang cư trú) và địa chỉ cư trú (địa điểm mà người đó sở hữu nhà hoặc có địa chỉ thường trú). Một đến nhiều khả năng mối quan hệ xảy ra trong thời gian đó. Do đó, chúng tôi có thể lưu trữ cả địa chỉ cố định và địa chỉ hiện tại trong một tài liệu bằng cách sử dụng mô hình tài liệu được nhúng.  

// Student document 
{ 
    StudentName: Ishan, 
    StudentId: k_hut_2022, 
    Branch:CSE 
} 
 
// Permanent Address document 
{ 
    StudentName: Ishan, 
    PermanentAddress: XXXXXXX, 
    City: Jaipur, 
    PinCode:302022 
} 
 
// Current Address document 
{ 
    StudentName: Ishan, 
    CurrentAddress: XXXXXXX, 
    City: Kota, 
    PinCode:324001 
} 

Thay vì viết ba tài liệu, bây giờ chúng ta có thể kết hợp chúng thành một.  

________số 8_______

Bởi vì chúng tôi giữ tất cả dữ liệu trong một bộ sưu tập duy nhất (ngay cả khi có nhiều hơn hai loại thông tin địa chỉ, chúng tôi có thể giữ chúng trong một mảng JSON), chúng tôi có thể truy vấn trong một lệnh gọi và lấy toàn bộ bộ dữ liệu, dẫn đến .  

Ở đây, chúng tôi đang sử dụng cơ sở dữ liệu knowledgehut và bộ sưu tập student.  

Chèn tài liệu vào bộ sưu tập với đoạn mã sau.  

db.student.insert({"StudentName":"Ishan","StudentId":"k_hut_2022","Branch":"CSE","PermanentAddress":[{"permaAddress":"xxxxxxxx","City":"Jaipur","PinCode":302022}, {"currAddress": "pppppp","City": "Kota","PinCode": 324001}]}) 
Data Relationships in MongoDB – A quick guide

Bây giờ chúng ta sẽ kiểm tra địa chỉ của học sinh.

db.student.find({StudentName:"Ishan"},{"PermanentAddress.permaAddress":1,"PermanentAddress.currAddress":1}).pretty() 
Data Relationships in MongoDB – A quick guide

Một trong những lợi ích chính của việc tạo Mối quan hệ được nhúng trong MongoDB là các truy vấn được thực thi nhanh hơn mối quan hệ được tham chiếu. Mối quan hệ này cũng cải thiện hiệu suất và thu được kết quả nhanh chóng. Điều này cũng đúng với các tập dữ liệu lớn.

Mối quan hệ một-nhiều với tham chiếu tài liệu

Mô hình tham chiếu tài liệu cũng có thể được sử dụng để tạo mối quan hệ một-nhiều. Chúng tôi giữ các tài liệu riêng biệt trong mô hình này, nhưng một tài liệu chứa các tham chiếu đến các tài liệu khác. Bạn không chắc nên bắt đầu hành trình phát triển của mình ở đâu? .   

Thí dụ.  

Với sự trợ giúp của một ví dụ, bây giờ chúng ta sẽ thảo luận về mối quan hệ một-nhiều với tài liệu tham khảo. Giả sử rằng chúng ta có một giáo viên dạy ở hai lớp khác nhau. Và cô ấy đang sở hữu ba tài liệu.  

// Class 1 document 
{ 
    TeacherId: k_hut_2022, 
    ClassName: khutA, 
    ClassId: D_123, 
    Studentcount: 44, 
    Subject: "DSA", 
} 
 
// Class 2 document 
{ 
    TeacherId: k_hut_2022, 
    ClassId: D_234, 
    ClassName: khutB, 
    Studentcount: 55, 
    Subject: "Compiler”, 
} 

Truy xuất dữ liệu từ các tài liệu khác nhau này hiện đang tốn thời gian. Do đó, chúng tôi sẽ sử dụng mô hình tham chiếu để hỗ trợ giáo viên truy xuất dữ liệu bằng một truy vấn duy nhất.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
0

Giờ đây, bạn có thể dễ dàng truy xuất dữ liệu cho lớp 1 và lớp 2 bằng cách sử dụng các trường classIds này.  

Ở đây, chúng tôi đang làm việc với cơ sở dữ liệu knowledgehut và bây giờ, chúng tôi sẽ sử dụng một giáo viên bộ sưu tập mới.  

Để chèn nhiều tài liệu, chúng ta sẽ sử dụng phương thức insertMany().  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
1

Khi bạn chèn các tài liệu này vào bộ sưu tập, bạn sẽ thấy kết quả như thế này.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
2

Bây giờ, để kiểm tra tài liệu, hãy sử dụng.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
3Data Relationships in MongoDB – A quick guide

Mối quan hệ nhiều-nhiều (N. M) 

Vì không có một lệnh duy nhất để triển khai mối quan hệ nhiều-nhiều trong cơ sở dữ liệu quan hệ nên sẽ khó hơn mối quan hệ một-nhiều. Điều này cũng đúng khi sử dụng mongoDB để triển khai chúng. Trên thực tế, bạn không thể sử dụng lệnh để tạo bất kỳ loại mối quan hệ nào trong MongoDB.   

Mặt khác, khả năng lưu trữ mảng trong tài liệu cho phép bạn lưu trữ dữ liệu theo cách dễ truy xuất và bảo trì, cũng như cung cấp cho bạn thông tin bạn cần để liên kết hai tài liệu trong mã của bạn.  

Mối quan hệ Nhiều đến Nhiều là một loại mối quan hệ mongodb trong đó hai thực thể bất kỳ trong một tài liệu có thể có nhiều mối quan hệ.  

Trong mối quan hệ này, chúng ta có thể xem xét trường hợp trang web khóa học trực tuyến nơi có nhiều khóa học và cũng có nhiều người dùng. Mỗi khóa học được mua bởi nhiều người dùng và mỗi người dùng có thể mua nhiều khóa học.  

Thí dụ.  

Đối với điều này, chúng tôi sẽ tạo một cơ sở dữ liệu kiến thức và hai bộ sưu tập người dùng và khóa học khác nhau.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
4

đầu ra.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
5

Trong bộ sưu tập khóa học, chúng tôi đã thêm hai khóa học và giá của các khóa học đó bằng đô la.  

Trong bộ sưu tập người dùng, chúng tôi sẽ thêm tài liệu của người dùng đã đăng ký khóa học bằng lệnh này.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
6

đầu ra.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
7

Chúng tôi có thể kiểm tra bộ sưu tập người dùng với.  

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
8Data Relationships in MongoDB – A quick guide

Tiếp theo, chúng ta phải cập nhật bộ sưu tập khóa học với userId.

{ 
    StudentName: Ishan, 
    StudentId: k_hut_2020, 
    Branch:CSE 
    PermanentAddress:{ 
        PremanentAddress: XXXXXXX, 
        City: Jaipur, 
        PinCode:302022 
    }  
} 
9

đầu ra.  

db.student.insert({"StudentName":"Ishan","StudentId":"k_hut_2022","Branch":"CSE","PermanentAddress":{"permaAddress":"xxxxxxxx","City":"Jaipur","PinCode":302022}}) 
0Data Relationships in MongoDB – A quick guide

Giờ đây, bạn có thể xem bộ sưu tập khóa học với userId trong danh sách người dùng.

Nhúng hoặc tham chiếu?

Có hai loại mối quan hệ trong MongoDB. Được nhúng và làm tài liệu tham khảo. Mỗi mối quan hệ đều có những lợi ích và hạn chế riêng. Các kết nối này hỗ trợ nâng cao hiệu suất. Nó thực hiện bất kỳ mối quan hệ nào là Một với Một, Một với Nhiều hoặc Nhiều với Nhiều tùy thuộc vào tình huống. Việc triển khai mối quan hệ này đã cải thiện tính nhất quán của dữ liệu.  

Hai cách khác nhau để mô hình hóa các mối quan hệ trong MongoDB là gì?

Trong MongoDB, một mối quan hệ biểu thị cách các loại tài liệu khác nhau có liên quan logic với nhau. Các mối quan hệ như một-một, một-nhiều, v.v. , có thể được biểu diễn bằng cách sử dụng hai mô hình khác nhau. Mô hình tài liệu nhúng. Mô hình tham chiếu

Làm cách nào để xử lý các mối quan hệ trong MongoDB?

Các mối quan hệ trong MongoDB thể hiện cách các tài liệu khác nhau có liên quan logic với nhau. Các mối quan hệ có thể được mô hình hóa thông qua các phương pháp được nhúng và tham chiếu. Những mối quan hệ như vậy có thể là 1. 1, 1. N, N. 1 hoặc N. N. Chúng ta hãy xem xét trường hợp lưu trữ địa chỉ cho người dùng

Khi nào chúng ta nên xem xét đại diện cho một

Trong cơ sở dữ liệu quan hệ, tồn tại mối quan hệ một-nhiều khi một hàng trong bảng A có thể được liên kết với nhiều hàng trong bảng B, nhưng một hàng trong bảng B là . Điều quan trọng cần lưu ý là mối quan hệ một-nhiều không phải là thuộc tính của dữ liệu, mà là của chính mối quan hệ đó. . It is important to note that a one-to-many relationship is not a property of the data, but rather of the relationship itself.

GT và LT trong MongoDB là gì?

$gt . Trùng khớp nếu giá trị lớn hơn giá trị đã cho. $lt . Trùng khớp nếu giá trị nhỏ hơn giá trị đã cho .