Hướng dẫn dùng mongodb json trong PHP

Giới thiệu:
MongoDB được xếp vào danh mục NoSQL Document. Tất cả các item của MongoDB đều được lưu trữ dưới dạng JSON Object (ko giống như Redis chỉ lưu trữ object dạng string).

MongoDB được xây dựng với các quy cách và cấu trúc câu lệnh dựa trên javascript, cái này sẽ ko nói sâu, ai có nhu cầu truy cập vào CLI của MongoDB thông qua lệnh mongo thì tự nghiên cứu nhé.

MongoDB có database, mỗi database có nhiều collection, và mỗi collection chứa nhiều document. Lưu ý là document ko cần thiết phải giống nhau về cấu trúc, thích vứt gì vào cũng đc. Nếu so sánh với RDBMS, thì database tương đương database, collection tương đương với table, document tương đương với row.

Cơ chế của mongo là lưu tất cả dữ liệu trên đĩa, cache index và một số dữ liệu hay dùng trên RAM (so với Redis là memory-mapped, tức là backup dữ liệu trên đĩa và lưu tất cả dữ liệu trên RAM). MongoDB chạy trên hệ thống 32bit bị giới hạn tổng dữ liệu là 2GB, giới hạn này ko có trên hệ thống 64bit.

Yêu cầu:
> PHP 5.3
MongoDB
PHP extension Mongo

Lưu ý: Tất cả các đoạn lệnh PHP trong bài viết đều nằm trong cặp thẻ

Kết nối đến DB:

PHP:

  1. $mongo = new Mongo(); // kết nối đến svr mặc định, giao thức tcp

hoặc nếu có authen:

PHP:

  1. $mongo = new Mongo('mongodb://username:password@host');

PHP Mongo có thể connect đc đến unix socket bằng string connection sau: mongodb:///tmp/mongodb.sock. Nhưng thử nghiệm trong nhiều trường hợp ko connect đc, éo hiểu tại sao (trong khi redis, mariadb vẫn qua unix socket bình thường). Thế nên khuyến cáo là chỉ connect qua TCP.

Chọn database:

PHP:

  1. $db = $mongo->selectDB('sieuquay');

Chọn collection:

PHP:

  1. $collection = $db->selectCollection('user');

Insert bản ghi, ở đây mình dùng stdClass, nhưng mọi ng` cũng có thể tự define entity class riêng của mình, hoặc sử dụng array associative, nên sử dụng array assoc, mình dùng stdClass vì quen:

PHP:

  1. $user = new stdClass();

  2. $user->_id = uniqid(); // cái này sẽ giải thích sau

  3. $user->username = 'katz';

  4. $user->email = '';

  5. $user->active = true;

  6. $user->age = 25;

  7. $user->password = md5salt('abc123'); // cái này k phải built-in method đâu nhá

  8. $job1 = new stdClass();

  9. $job1->name = 'Developer';

  10. $job1->active = true;

  11. $job2 = new stdClass();

  12. $job2->name = 'Lover';

  13. $job2->active = true;

  14. $user->jobs = array($job1, $job2);

  15. $collection->insert($user);

Bam, xong! Nếu xong trong mongo shell, thì cái item kia sẽ có dạng cấu trúc sau:

Code (text):

  1. {

  2. "_id": "abc123sadjasdjkak",

  3. "username": "katz",

  4. "email": "",

  5. "active": true,

  6. "age": 25,

  7. "password": "dsaO$I@UHDSAB",

  8. "jobs": [

  9. {

  10. "name": "Developer",

  11. "active": true

  12. },

  13. {

  14. "name": "Lover",

  15. "active": true

  16. }

  17. ]

  18. }

Tất cả các item trong MongoDB đều có một attribute _id. Nếu ko gán giá trị cho attribute này lúc insert, thì mặc định MongoDB sẽ gán một object MongoID vào. Tốt nhất là lúc insert cứ gán vào, vì nếu ko gán, select bằng attribute _id này rất khó, trừ trường hợp ko select bằng _id.

Lưu ý là MongoDB phân biệt rõ ràng kiểu int và string, vì vậy nên ép về đúng kiểu lúc insert để tiện đường sau này. Cái này là rút ra từ kinh nghiệm bản thân

Hướng dẫn dùng mongodb json trong PHP

Update:

PHP:

  1. $updateQuery = array('$set'=>array('age' => 26));

  2. $updateCondition = array('username' => 'katz');

  3. $collection->update($updateCondition, $updateQuery);

Query:

Tìm nhiều bản ghi:

PHP:

  1. $cursor = $collection->find(array('active'=>true));

  2. foreach ($cursor as $user) {

  3. // do something with user

  4. }

Lưu ý: cách này trả về MongoCursor, chứ ko phải array, thế nên phải dùng foreach để chạy qua từng item một.

hoặc dùng cách này để không phải dùng foreach mà có luôn một array tất cả các item:

PHP:

  1. $cursor = $collection->find(array('active'=>true));

Tìm một bản ghi, lưu ý method này luôn trả về array assoc, key sẽ là attribute của item:

PHP:

  1. $user = $collection->findOne(array('username'=>'katz'));

Bây h sẽ là tìm theo điều kiện advanced hơn chút:

Tìm user hơn 24 tuổi:

PHP:

  1. $users = $collection->find(array('age'=>array('$gt' => 24)));

Danh sách tất cả operator xem ở đây:
http://docs.mongodb.org/manual/reference/operator/

Tìm user hơn 24 tuổi và active:

PHP:

  1. $users = $collection->find(array('age'=>array('$gt' => 24), 'active' => true));

Tìm user có job là Lover:

PHP:

  1. $users = $collection->find(array('jobs.name' => 'Lover'));

Bỏ qua 20 user đầu:

PHP:

  1. $users = $collection->find()->skip(20);

Bỏ qua 20 user đầu, và chỉ lấy 10 user:

PHP:

  1. $users = $collection->find()->skip(20)->limit(10);

Sort theo tuổi:
Sort asc thì dùng giá trị 1:

PHP:

  1. $users = $collection->find()->sort(array('age' => 1));

Sort desc thì dùng giá trị -1:

PHP:

  1. $users = $collection->find()->sort(array('age' => -1));

Xoá user:

PHP:

  1. $collection->remove(array('username' => 'katz'));

Tạo index:
Giá trị 1 cho sort ASC, -1 cho sort DESC:

PHP:

  1. $collection->ensureIndex(array('age' => 1));

Index sao cho email phải là unique:

PHP:

  1. $collection->ensureIndex(array('email'=>1), array('unique' => true));

Index email unique, chạy background lúc index (tức là async):

PHP:

  1. $collection->ensureIndex(array('email'=>1), array('unique' => true, 'background'=>true));

Index nhiều attribute:

PHP:

  1. $collection->ensureIndex(array('email'=>1, 'active'=>1));