icon picker
6 rules - mongodb

Ở SQL có mối quan hệ 1 - N → bên nosql phải làm sao đây
Ta cần chia nó ra thành 3 loại nhỏ hơn
one - to - few
one - to - many
one - to - squilions

One - to - few

Ví dụ có thể là địa chỉ của một người, (ít) nên ta có thể gán nó vào trong model người luôn
> db.person.findOne()
{
name: 'Kate Monster',
ssn: '123-456-7890',
addresses : [
{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }
]
}
Ích lợi: không cần phải query nhiều để lấy các thông tin addr như trên
Bất lợi: không thể query các thông tin addr một cách độc lập

One - to -many

vd là một sản phần có nhiều thành phần được rắp láp lại. Và mỗi thành phần có một số thông tin
> db.parts.findOne()
{
_id: ObjectID...
partno:...
name: ..
qty: ...
cost: 0.94
price
}
> db.products.findOne()
{
name:
manufacturer: 'abc',
catalog
parts: [
ObjectID,
ObjectID,
ObjectID,
]
}
Bạn có thể query một cách tốt hơn
// Fetch the product document identified by this catalog number
product = db.products.findOne({ catalog_number: 1234});
// Fetch all the Parts that are linked to this
product_parts = db.parts.find({ _id: { $in: }}).toArray();
Ích lợi: vì product_parts nằm trong document riêng → có thể truy cập độc lập
Disadvantage: Phải query 2 câu nếu muốn lấy hết các parts của một product

One - to - squillions

ví dụ có thể là hệ thông log - một host có thể có rất rất nhiều log
Cách tốt là lưu ObjectId của host trong mỗi log
db.hosts.findOne()
{
_id: ObjectID,
name:
ipaddr: '',
}
db.logmsg.findOne()
{
time: Date,
message: 'cpu is on fire!',
host: ObjectID
}
Cách query có thể như sau
host = db.hosts.findOne({ ipaddr: '127.0.0.1'});
last_5k_msg = db.logmsg.find({ host: host.id}).sort({time: -1}).limit(5000).toArray();

Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.