Upload
pisit-makpaisit
View
1.694
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Friendly introduction to MongoDB in Thai
Citation preview
พิ�สิ�ษฐ์� มรรคไพิสิ�ฐ์ 5514552616
เกี่��ยวกี่�บ MongoDB
• พิ�ฒนาโดยบร�ษ�ท 10gen• เป็�น Document-oriented Database• ม� feature มากี่มายเหม�อน Relational
Database• Scalable (Replication, Sharding)• สิน�บสิน�น Map-Reduce
2
JSON Document
• ป็ระกี่อบด!วยหลาย Database• แต่%ละ Database ป็ระกี่อบด!วยหลาย Collections (เท�ยบ
ได!กี่�บ Table)• ข้!อม'ลจะถู'กี่เร�ยกี่ว%า Document (เท�ยบได!กี่�บ Row)• JSON document (key, value) เช่%น
{ “name” : “som-tam”, “price” : 30, “ingredients” : [“papaya”, “tomato”, “chili”]}
3
BSON Encoding
• ผู้'!ใช่!มอง document อย'%ในร'ป็แบบข้อง JSON• ข้!อม'ลจร�งจะเกี่.บในร'ป็ BSON (Binary JSON)• BSON - http://bsonspec.org
{_id: ObjectId(XXXXXXXXXXXX), hello: “world”}
\x27\x00\x00\x00\x07_id\x00XXXXXXXXXXXX\x02hello\x00\x06\x00\x00\x00world\x00\x00
4
เป็ร�ยบเท�ยบกี่�บ Relational DB
Server Database Table Row Column• ม� Join• Atomicity ระด�บ
Transaction
Server Database Collection Document
(JSON) Field• ไม%ม� Join• Atomicity ระด�บ
Document
Relational DB MongoDB
5
เร��มต่!นใช่!งาน• DBMS ข้อง MongoDB
– mongod ร�นเป็�น daemon process
• Mongo Shell– mongo สิ%งค/าสิ��งไป็ย�ง mongod โดยใช่!ภาษา
JavaScript
• MongoDB API (http://api.mongodb.org/) – pymongo สิ/าหร�บภาษา Python
6
ต่�วอย%างค/าสิ��ง> db.people.insert( {name:’Wachira Poothong’,
email:’[email protected]’, sex:’male’} )
> db.people.insert( {name:’Pisit Makpaisit’, age:25, interesting:[‘Parallel Computing’, ‘Programming’]} )
Schemaless!
7
ต่�วอย%างค/าสิ��ง> db.people.find(){ "_id" : ObjectId("51206cee15407f12ea3db21b"),
"name" : "Wachira Poothong", "email" : "[email protected]", "sex" : "male" }
{ "_id" : ObjectId("51206d2a15407f12ea3db21c"), "name" : "Pisit Makpaisit", "age" : 25, "interesting" : [ "Parallel Computing", "Programming" ] } db.people.insert( {name:’Wachira Poothong’, email:’[email protected]’, sex:’male’} )
> db.people.find( {name:’Pisit Makpaisit’} ){ "_id" : ObjectId("51206d2a15407f12ea3db21c"),
"name" : "Pisit Makpaisit", "age" : 25, "interesting" : [ "Parallel Computing", "Programming" ] }
8
ต่�วอย%างค/าสิ��ง> 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" : "[email protected]", "sex" : "male" }
9
ต่�วอย%างค/าสิ��ง> db.people.update( {name:’Wachira Poothong’}, {age:25} )> db.people.findOne( ){ "_id" : ObjectId("51206cee15407f12ea3db21b"),
"name" : "Wachira Poothong", “age" : 25, "email" : "[email protected]", "sex" : "male" }
> db.people.remove( {name:’Wachira Poothong’} )> db.people.remove()
10
CRUD
Operator SQL MongoDBCreate INSERT INSERTRead SELECT FIND
Update UPDATE UPDATEDelete DELETE REMOVE
11
กี่ารออกี่แบบ Schema
• เน��องจากี่ไม%ม� Join เหม�อน RDBMS• Pre-join หร�อ Embedded• Application-Driven Schema - ออกี่แบบ
โดยด'จากี่กี่ารใช่!งานข้!อม'ลข้องโป็รแกี่รม
12
ต่�วอย%างเว.บเพิจหน!าแสิดงข้!อม'ล DVD• RDBMS เกี่.บข้!อม'ลเป็�น table ด�งน�1
– 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: ‘น!องแป็2ง’, body: ‘สิน�กี่จ�งเบย’, date: ‘2012-12-22 10:12:07’}] }
13
ท/าย�งไงเม��อไม%ม� Join
• Join เอง ในระด�บ Application• Pre-join หร�อ Embedded โดยพิ�จารณาจากี่
– ความถู��ในกี่ารใช่!งานร%วมกี่�น– ข้นาดข้อง document
• Embedded ท/าให! atomicity ระด�บ document เพิ�ยงพิอ
14
Replication
• เกี่.บข้!อม'ลซ้ำ/1ากี่�นในหลายท��• เพิ��ม availability• Back up ข้!อม'ล• Read ข้!อม'ลได!เร.วข้51น
15http://blog.codecentric.de/en/2012/12/mongodb-the-sixth-sense/
Replica Sets
• เป็�น cluster ข้อง mongod (daemon)• ข้!อม'ลจะถู'กี่เข้�ยนลงไป็ท��ต่�ว primary (ม�เพิ�ยงต่�ว
เด�ยว)• ต่�วอ��นจะเร�ยกี่ว%า secondary และค�ดลอกี่ข้!อม'ล
มาจากี่ primary• Automated failover – ถู!า primary ต่าย
จะเล�อกี่ต่�วใหม%มาเป็�น primary อ�ต่โนม�ต่�16
Sharding
• แบ%งกี่ล�%มข้อง document ไป็ย�งเคร��องต่%างๆ
• แบ%ง Collection ออกี่เป็�น chunks
• ใช่! shard key เป็�นหล�กี่ในกี่ารแบ%ง• เม��อม� shard หน5�งม� chunks มากี่
เม��อเท�ยบกี่�บ shard อ��น จะท/ากี่าร redistribute (Shard Balancing)
17http://blog.codecentric.de/en/2012/12/mongodb-the-sixth-sense/
เม��อไหร%จ5งท/า Sharding
• เม��อข้!อม'ลมากี่จน Storage ข้องเคร��องเด�ยวเกี่.บไม%พิอ
• เพิ��มป็ระสิ�ทธิ�ภาพิด!วยกี่ารเพิ��มข้!อม'ลท��ท/างานบน RAM
• ม�กี่ารเข้�ยนข้!อม'ลจ/านวนมากี่ (ต่!องกี่ารให!เข้�ยนได!เร.ว)
18
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
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
Map-Reduce
• orders เป็�นช่��อ collection• เร�ยกี่ด!วยฟั9งกี่�ช่�น mapReduce ( )• น/าผู้ลล�พิธิ�ไป็เกี่.บท�� collection ช่��อ
map_reduce_example db.orders.mapReduce(
mapFunction, reduceFunction, { out: "map_reduce_example" } )
21
เอกี่สิารอ!างอ�ง• http://horicky.blogspot.com/2012/04/mongodb-
architecture.html• http://www.slideshare.net/mdirolf/inside-
mongodb-the-internals-of-an-opensource-database
• http://docs.mongodb.org/manual/replication/• http://docs.mongodb.org/manual/sharding/• http://docs.mongodb.org/manual/applications/
map-reduce/
22