NoSQL กับ Mongo DB เขียนง่ายสบายจายยยย

สวัสดีครับ ช่วงนี้ห่างหายจากการอัพเดทไปเลย พอดีติดเกมส์ 555++
จริงๆ แล้ววันนี้มีหลายเรื่องที่อยากจะมาเล่าสู่กันฟัง อาทิเช่น
NodeJS
Facebook Offline Message API
CI 2.0.1
วิธีการทำ Caching ของ Facebook
Cross Domain Cookie
วิธีการใช้ domain, subdomain map เข้ากับ user ของเราผ่าน CI, etc....
แต่ก็สรุปมาเลือก MongoDB ที่เป็น NoSQL โดยไม่มีเหตุผลอะไรรองรับ นอกจากว่า "มันเขียนอธิบายง่ายสุด" ส่วนเรื่องอื่นๆ ใครสนใจเรื่องไหน ก็บอกกันได้นะครับ จะได้มาไว้เขียนในคราวหน้า
เอาล่ะๆ มาเริ่มกันเลยดีกว่า
NoSQL จริงๆ แล้วก็ต้องถือเป็น ฐานข้อมูลชนิดนึง ซึ่งจะแตกต่างจาก Database พวกภาษา SQL ทั้งหลาย คือตัวมันจะเป็น ฐานข้อมูลที่ไม่มีความสัมพันธ์กัน เพราะฉะนั้น ลืมเรื่อง relation ไปก่อน สักพัก
แล้วก็สามารถรองรับกับจำนวนข้อมูลที่มากมายได้ โดยยังทำงานได้เร็ว เพราะไม่ต้องมีความสัมพันธ์ใดๆ ฉะนั้น ไม่ต้องกังวลว่า Index จะทำงานมั้ย มันยังไงก็ทำงาน
แล้วก็ข้อดี (รึเปล่า) คือมันไม่มี structure คลุม ไม่ต้องมาสร้าง fields เตรียมไว้ก่อน อยากเก็บยังไๆงก็เก็บ แต่ก็ควรคิดให้ดีๆ ซะก่อน
สามารถขยาย scale ออกได้ง่ายๆ เพราะเป็นการต่อตรง เวลาข้อมูลเยอะเข้าๆ ก็เพิ่มเครื่องๆๆๆๆๆ เข้าไปเรื่อยๆ อันนี้ดีสุดๆ
เว็บไซต์ระดับโลกที่มีข้อมูล มหาศาลยังไงก็ต้องออกแบบใน ลักษณะนี้ทั้งนั้น อาทิ Facebook, Twitter เพราะจำนวนข้อมูล ไหลเข้า ไหลออก มีมากมายมหาศาล
NoSQL ก็มีมากมายหลายตัวอีก แต่ที่วันนี้จะมาพูดกันนะ คือ MongoDB เอาเป็นเชิงปฎิบัติ หรือการใช้งานกันเลยดีกว่า เรื่อง ทฤษฎี ไม่ค่อยจะถูกกับผมนัก ไอ้ที่เขียนไปข้างบน ถูกบ้าง ผิดบ้างก็ขออภัยด้วยนะ อย่าว่ากันเลย
การใช้งานนั้น ถ้าเขียนผ่าน PHP Framework ก็เอา Google หาได้เลย มีคนเขียน client มาเยอะแยะอยู่แล้ว
แต่ทีนี้ผมจะมาพูด เอาเป็นใช้งานผ่าน PHP โดยตรงเลย
สิ่งที่เราต้องมีในวันนี้ก็คือ
1. MongoDB
http://www.mongodb.org/downloads
2. PHP Mongo Extension
http://php.net/manual/en/mongo.installation.php
เท่านี้แหละครับ ที่เราต้องมีพิเศษกว่าครั้งอื่น ส่วนวิธีการลง มันมีบอกไว้อยู่แล้วตามลิ้งค์เลย
พอเราได้มาครบติดตั้งเสร็จเรียบร้อย ก็มาเริ่ม start mongo กันก่อน โดยเปิด cmd ขึ้นมา (ผมเขียนผ่าน Windows)
d:/PHPCode/mongo/mongodb/bin/mongod.exe --dbpath d:/PHPCode/mongo/Storage/
แนะนำให้เขียนเป็น .bat ไว้เลย เวลา start จะได้ไม่เสียเวลา
โดยตัวแรกจะเป็นที่อยู่ .exe ของ mongodb ที่เราโหลดมา
ตัวที่สองจะเป็น ที่อยู่ที่จะเป็น root ของการจัดเก็บข้อมูล
ตัวอย่างการ connect
// connect mongo on localhost $m = new Mongo; // select database $db = $m->people; // select collection $collection = $db->person;
ให้มองเหมือน db ก็ได้คือต้อง conenct -> select db -> select table
อันนี้ผม conenct ผ่าน localhost เลยไม่จำเป็นต้องระบุ IP:PORT ลงไป
ตัวอย่างการ Insert
$insert = array( 'name' => $_POST['name'], 'lastname' => $_POST['lastname'], 'age' => $_POST['age'], 'comments' => array() ); $collection->insert($insert, true); $m->close();
โดยค่า last insert id เราสามารถ get ออกมาด้วยคำสั่งนี้
$insert['_id']
ตัวอย่างการดึงข้อมูลทั้งหมด พร้อม where case, pagination limit
$docs_per_page = 5;
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$q = isset($_GET['q']) ? $_GET['q'] : "";
$m = new Mongo;
$db = $m->project;
$collection = $db->users;
$criteria = array();
if (isset($q{0})) {
$criteria['first_name'] = new MongoRegex('/' .$q . '/i');
//$criteria['last_name']['$or'] = new MongoRegex('/' .$q . '/i');
}
$fields = array('email', 'first_name', 'created_at');
$skip = (int) ($docs_per_page * ($page - 1));
$limit = (int) $docs_per_page;
$cursor = $collection->find($criteria, $fields);
$cursor->sort(array('created_at' => -1))->skip($skip)->limit($limit);
$total_result = $cursor->count();
$total_page = (int) (ceil($total_result/$docs_per_page));
$m->close();
ตัวอย่างการดึงข้อมูลแบบ Record เดียว
$m = new Mongo; $db = $m->people; $collection = $db->person; $criteria = array( '_id' => new MongoId($id) ); $doc = $collection->findOne($criteria);
ตัวอย่างการ Update
// connect mongo on localhost $m = new Mongo; // select database $db = $m->people; // select collection $collection = $db->person; $criteria = array( '_id' => new MongoId($id) ); $doc = array( 'name' => $_POST['name'], 'lastname' => $_POST['lastname'], 'age' => $_POST['age'], 'comments' => array() ); $collection->update($criteria, $doc); $m->close();
เท่านี้แหละครับ Syntax ไม่มีอะไรซับซ้อนเลยสักนิด สังเกตุ ดีๆ มันทำงานคล้ายๆ กับ database ปกติ แหละ จริงๆ แล้ว ผมมีตัวอย่างเว็บ ที่อยากให้ไปลองอ่านกัน ซึ่งเข้าเขียน เทียบกับ SQL ให้เราเห็นเลยว่า Flow มันไม่หนีกันเลย แถมยังไม่ต้องมาคิดเรื่อง Relation ให้ปวดหัวอีกด้วย
http://www.dealtaker.com/blog/2010/05/12/php-mongodb-sitting-in-a-tree-part-1/
http://www.shift8creative.com/blog/mongodb-queries-with-lithium-part-two
ไอ้ 2 ลิ้งค์ข้างบนอ่านแล้วจะทำความเข้าใจได้ดีมากๆ แนะนำเลย
ส่วนตรงนี้ถือเป็นข้อมูลที่มีประโยชน์เพิ่มเติมนะครับ
http://www.slideshare.net/kbanker/mongodb-schema-design
อันนี้เป็น Client ที่ใช้กับ CI ครับ (โดยส่วนตัวไม่คิดว่าจะมีประโยชน์นัก เพราะว่า มันแค่ตัวครอบ ที่เหมือนยังเขียนไม่เสร็จซะมากกว่า)
https://bitbucket.org/alexbilbie/codeigniter-mongo-library/wiki/Home
ยังไง ถ้าใครลองเล่นแล้วมี Idea อะไรดีๆ ก็ลงมือ ศึกษาแล้วทำเลยนะครับ ถึงจะไม่สำเร็จอย่างน้อยเราก็มีความรู้เพิ่มขึ้นมาอีกระดับครับ ^^

21 comments