- Mastering MongoDB 3.x
- Alex Giamas
- 217字
- 2021-08-20 10:10:51
One-to-many, many-to-many
When the number of elements in the many side of the relationship can grow unbounded, it's better to use references.
References can come in two forms:
From the one-side of the relationship, store an array of many-sided-elements:
> db.Person.findOne()
{ "_id" : ObjectId("590a530e3e37d79acac26a41"), "name" : "alex", addresses:
[ ObjectID('590a56743e37d79acac26a44'),
ObjectID('590a56743e37d79acac26a46'),
ObjectID('590a56743e37d79acac26a54') ] }
This way we can get the array of addresses from the one-side and then query with in to get all the documents from the many-side:
> person = db.Person.findOne({"name":"mary"})
> addresses = db.Addresses.find({_id: {$in: person.addresses} })
Turning this one-many to many-many is as easy as storing this array in both ends of the relationship (person and address collections).
From the many-side of the relationship, store a reference to the one-side:
> db.Address.find()
{ "_id" : ObjectId("590a55863e37d79acac26a44"), "person": ObjectId("590a530e3e37d79acac26a41"), "address" : [ "N29DD" ] }
{ "_id" : ObjectId("590a55863e37d79acac26a46"), "person": ObjectId("590a530e3e37d79acac26a41"), "address" : [ "SW1E5ND" ] }
{ "_id" : ObjectId("590a55863e37d79acac26a54"), "person": ObjectId("590a530e3e37d79acac26a41"), "address" : [ "N225QG" ] }
> person = db.Person.findOne({"name":"alex"})
> addresses = db.Addresses.find({"person": person._id})
As we can see, with both designs we need to make two queries to the database to fetch the information. The second approach has the advantage that it won't let any document grow unbounded so it can be used in cases where one-many is one-millions.
- Google Cloud Platform Cookbook
- Getting Started with Containerization
- Cloud Analytics with Microsoft Azure
- Google App Inventor
- 計算機網絡技術基礎
- Blender Compositing and Post Processing
- 基于單片機的嵌入式工程開發詳解
- 運動控制系統應用與實踐
- Mastering Game Development with Unreal Engine 4(Second Edition)
- 從零開始學C++
- 從零開始學JavaScript
- 生成對抗網絡項目實戰
- ADuC系列ARM器件應用技術
- Practical Network Automation
- 系統建模與控制導論