Basic MongoDB
- 2. เกี่ยวกับ MongoDB
• พัฒนาโดยบริษัท 10gen
• เป็น Document-oriented Database
• มี feature มากมายเหมือน Relational
Database
• Scalable (Replication, Sharding)
• สนับสนุน Map-Reduce
2
- 3. JSON Document
• ประกอบด้วยหลาย Database
• แต่ละ Database ประกอบด้วยหลาย Collections
(เทียบได้กับ Table)
• ข้อมูลจะถูกเรียกว่า Document (เทียบได้กับ
Row)
• JSON document (key, value) เช่น{
“name” : “som-tam”,
“price” : 30,
“ingredients” : [“papaya”, “tomato”, “chili”]
}
3
- 4. BSON Encoding
• ผู้ใช้มอง document อยู่ในรูปแบบของ JSON
• ข้อมูลจริงจะเก็บในรูป BSON (Binary JSON)
• BSON - http://bsonspec.org
{_id: ObjectId(XXXXXXXXXXXX), hello: “world”}
x27x00x00x00x07_idx00XXXXXXXXXXXX
x02hellox00x06x00x00x00worldx00x00
4
- 6. เริ่มต้นใช้งาน
• DBMS ของ MongoDB
– mongod รันเป็น daemon process
• Mongo Shell
– mongo ส่งคำาสั่งไปยัง mongod โดยใช้ภาษา
JavaScript
• MongoDB API (http://api.mongodb.org/)
– pymongo สำาหรับภาษา Python
6
- 8. ตัวอย่างคำาสั่ง
> db.people.find()
{ "_id" : ObjectId("51206cee15407f12ea3db21b"), "name"
: "Wachira Poothong", "email" : "wp@zzz.com", "sex" :
"male" }
{ "_id" : ObjectId("51206d2a15407f12ea3db21c"), "name"
: "Pisit Makpaisit", "age" : 25, "interesting" : [ "Parallel
Computing", "Programming" ] }
db.people.insert( {name:’Wachira Poothong’,
email:’wp@zzz.com’, sex:’male’} )
> db.people.find( {name:’Pisit Makpaisit’} )
{ "_id" : ObjectId("51206d2a15407f12ea3db21c"), "name"
: "Pisit Makpaisit", "age" : 25, "interesting" : [ "Parallel
Computing", "Programming" ] } 8
- 9. ตัวอย่างคำาสั่ง
> db.people.find( {age:{$gt:15}} )
{ "_id" : ObjectId("51206d2a15407f12ea3db21c"), "name"
: "Pisit Makpaisit", "age" : 25, "interesting" : [ "Parallel
Computing", "Programming" ] }
> db.people.find( {email:{$exist:true}} )
{ "_id" : ObjectId("51206cee15407f12ea3db21b"), "name"
: "Wachira Poothong", "email" : "wp@zzz.com", "sex" :
"male" }
9
- 10. ตัวอย่างคำาสั่ง
> db.people.update( {name:’Wachira Poothong’}, {age:25} )
> db.people.findOne( )
{ "_id" : ObjectId("51206cee15407f12ea3db21b"),
"name" : "Wachira Poothong", “age" : 25, "email" :
"wp@zzz.com", "sex" : "male" }
> db.people.remove( {name:’Wachira Poothong’} )
> db.people.remove()
10
- 13. ตัวอย่างเว็บเพจหน้าแสดงข้อมูล
DVD• RDBMS เก็บข้อมูลเป็น table ดังนี้
– DVD (dvd_id, name, volume, price, distributor_id)
– Distributor (distributor_id, name, address)
– Comment (comment_id, dvd_id, author, body, date)
• MongoDB เก็บเป็น document เดียวกัน
– { name: ‘Digimon Xros Wars’, volume: 6, price: 169,
distributor: ‘TIGA’, comments: [
{author: ‘เกรียน’, body: ‘ที่ 1’, date: ‘2012-12-21
13:34:42’},
{author: ‘น้องแป้ง’, body: ‘สนุกจุงเบย’, date: ‘2012-
12-22 10:12:07’}] 13
- 14. ทำายังไงเมื่อไม่มี Join
• Join เอง ในระดับ Application
• Pre-join หรือ Embedded โดยพิจารณาจาก
– ความถี่ในการใช้งานร่วมกัน
– ขนาดของ document
• Embedded ทำาให้ atomicity ระดับ document
เพียงพอ
14
- 16. Replica Sets
• เป็น cluster ของ mongod (daemon)
• ข้อมูลจะถูกเขียนลงไปที่ตัว primary (มีเพียงตัว
เดียว)
• ตัวอื่นจะเรียกว่า secondary และคัดลอกข้อมูล
มาจาก primary
• Automated failover – ถ้า primary ตาย จะ
เลือกตัวใหม่มาเป็น primary อัตโนมัติ
16
- 17. Sharding
• แบ่งกลุ่มของ document ไป
ยังเครื่องต่างๆ
• แบ่ง Collection ออกเป็น
chunks
• ใช้ shard key เป็นหลักใน
การแบ่ง
• เมื่อมี shard หนึ่งมี chunks
มากเมื่อเทียบกับ shard อื่น
จะทำาการ redistribute 17
http://blog.codecentric.de/en/2012/12/mongodb-the-sixth-sense/
- 19. Map-Reduce
• { _id: ObjectId("50a8240b927d5d8b5891743c"),
cust_id: "abc123",
ord_date: new Date("Oct 04, 2012"),
status: 'A',
price: 250,
items: [ { sku: "mmm", qty: 5, price: 2.5 },
{ sku: "nnn", qty: 5, price: 2.5 } ] }
• อยากรู้ยอดรวมการสั่งสินค้าของลูกค้าแต่ละคน
19
- 20. Map-Reduce
• มี 2 Operator หลัก คือ Map และ Reduce
• Map - จับคู่ระหว่าง Key-Value
var mapFunction = function() {
emit(this.cust_id, this.price);
};
• Reduce - รวบรวมค่า Value ของแต่ละ Key
จนเหลืออันเดียว
var reduceFunction = function(keyCustId, valuesPrices)
{
return Array.sum(valuesPrices); 20
- 21. Map-Reduce
• orders เป็นชื่อ collection
• เรียกด้วยฟังก์ชัน mapReduce ( )
• นำาผลลัพธ์ไปเก็บที่ collection ชื่อ
map_reduce_example
db.orders.mapReduce(
mapFunction,
reduceFunction,
{ out: "map_reduce_example" }
)
21