การใช้ nosql บน mongodb
MongoDB คืออะไร

มองโกดีบี (mongoDB) คือ โปรแกรมระบบจัดการฐานข้อมูล มีหน้าที่เก็บข้อมูล แบบไม่ใช้ภาษาเอสคิวแอล (NoSQL = Not Only / No Structured Query Language) เป็นเครื่องมือสำหรับเก็บข้อมูล แบบเอกสาร (Document database) ซึ่งไม่จำกัดว่าข้อมูลที่เข้ามาต้องมี Field เท่ากันทุกระเบียน และไม่มี Table หรือ Field เหมือนกับระบบฐานข้อมูลเชิงสัมพันธ์ (Relational Database) โดยโครงสร้างการเก็บข้อมูลใช้รูปแบบ JSON (JavaScript Object Notation)

ตัวอย่างข้อมูลใน MongoDB
{ 
"_id":ObjectId("5b2a3440bde42531a4fcab2a"), 
"x":1 
}
{ 
"_id":ObjectId("5b2a3489bde42531a4fcab2b"), 
"y":2 
}

เอสคิวแอล (SQL = Structured Query Language) คือ ภาษาสอบถามข้อมูล หรือภาษาจัดการข้อมูลอย่างมีโครงสร้าง มีการพัฒนาภาษาคอมพิวเตอร์ และโปรแกรมฐานข้อมูลที่รองรับมากมาย เพราะจัดการข้อมูลได้ง่าย เช่น MySQL, MariaDB, MsSQL, PostgreSQL หรือ MS Access เป็นต้น สำหรับโปรแกรมฐานข้อมูลที่ได้รับความนิยมคือ MySQL หรือ MariaDB เป็น Open Source ที่ใช้งานได้ทั้งใน Linux และ Windows

มายเอสคิวแอล (MySQL) คือ โปรแกรมระบบจัดการฐานข้อมูล มีหน้าที่เก็บข้อมูลอย่างเป็นระบบ รองรับคำสั่งเอสคิวแอล (SQL = Structured Query Language) เป็นเครื่องมือสำหรับเก็บข้อมูล ที่ต้องใช้ร่วมกับเครื่องมือหรือโปรแกรมอื่นอย่างบูรณาการ เพื่อให้ได้ระบบงานที่รองรับความต้องการของผู้ใช้ เช่นทำงานร่วมกับเครื่องบริการเว็บ (Web Server) เพื่อให้บริการแก่ภาษาสคริปต์ที่ทำงานฝั่งเครื่องบริการ (Server-Side Script) เช่น ภาษาพีเอชพี ภาษาเอเอสพี หรือภาษาเจเอสพี เป็นต้น หรือทำงานร่วมกับโปรแกรมประยุกต์ (Application Program) เช่น ภาษาวิชวลเบสิก ภาษาจาวา หรือภาษาซี เป็นต้น

มายเอสคิวแอล (MySQL) เป็นระบบฐานข้อมูลแบบโอเพนซอร์ท (Open Source Database) สำหรับจัดการระบบดาต้าเบส (Database System) ผ่านเอสคิวแอล (SQL) โปรแกรมนี้ถูกพัฒนาโดย บริษัท MySQL AB ในประเทศสวีเดน มีทั้งแบบใช้ฟรี และเชิงธุรกิจ

การติดตั้ง PHP 5.6.3 + PHP_Mongo 1.6 + Mongodb 3.0.6

การติดตั้ง MongoDB แบบ Enterprise Server ด้วย .msi โดยดาวน์โหลดรุ่น 3.6.5 (เมื่อวาน) จาก mongodb.com พบว่า ไม่ราบรื่น บน Windows ที่ผมใช้อยู่ ติดตรง Requirement นะครับ จึงเปลี่ยนไปเป็นแบบ .zip จาก Archive พบว่า unzip แล้วใช้งานบน DOS Command Line ได้เหมือนกับ MySQL คือ Start Service ด้วย Mongod.exe แล้วเข้าสั่งงานใน Database ด้วย Mongo.exe การติดตั้งแบบนี้ สร้างข้อมูลได้ และใช้ PHP บน XAMPP เข้ามาติดต่อได้ ผมก็พอใจแล้ว มีคำแนะนำการติดตั้งอย่างละเอียดที่ mongodb.com/manual

ขั้นตอนการติดตั้ง และเพิ่มข้อมูล (ทดสอบ 21 มิ.ย.61)
1. ดาวน์โหลดโปรแกรม mongodb-win32-i386-3.0.6.zip จาก https://www.mongodb.org/dl/win32/i386
2. unzip แล้วเปลี่ยนชื่อเป็น "mongodb" แล้วย้ายไป c:\
3. เปิดโปรแกรม cmd แล้วเข้า cd c:\mongodb\bin
4. DOS> mongod --help | more พบว่า แสดงรายการตัวเลือกมากมายให้ใช้
5. DOS> mkdir c:\mongodb\db
6. DOS> mkdir c:\mongodb\log
7. DOS> copy con mongod.cfg (ใน c:\mongodb\bin)
systemLog:
  destination: "file"
  path: "c:\\mongodb\\log\\mongod.log"
storage:
  dbPath: "c:\\mongodb\\db"
ปิดแฟ้มด้วยการกด ctrl+z หรือกดปุ่ม F6
8. DOS> mongod --config "C:\mongodb\bin\mongod.cfg" --journal
[initandlisten] waiting for connections on port 27017
--journal คือ การเก็บเหตุการณ์ไว้ตรวจสอบกรณีระบบล้ม
ถ้าใช้ netstat -na จะตรวจพบว่า port 27017 ถูกเปิดอยู่
9. DOS> mongo
https://docs.mongodb.com/manual/tutorial/insert-documents/
> (พบว่าเปิด MongoDB Enterprise Shell สำเร็จ)
> exit (ออกจาก mongodb shell)
10. การใช้คำสั่งใน MongoDB Enterprise Shell 
> db (Database Listing)
test
> use test (Select DB to work)
switched to db test
> db.createCollection( "myCollection")
{ "ok" : 1 }
> db.version
3.0.6 พบว่าการใช้ insertOne ใช้ได้ตั้งแต่รุ่น 3.2 เป็นต้นไป

11. การเพิ่มข้อมูลใน test
https://docs.mongodb.com/manual/mongo/
> db.myCollection.insertOne({x:1}); โดยใช้ insert แทน insertOne สำหรับรุ่นต่ำกว่า 3.2
{"acknowledged" : true,"insertedId" : ObjectId("5b2a3489bde42531a4fcab2b")}
> db.myCollection.insertOne({y:2});
{"acknowledged" : true,"insertedId" : ObjectId("5b2a3489bde42531a4fcab2b")}
> db.myCollection.insertOne({z:3});
{"acknowledged" : true,"insertedId" : ObjectId("5b2a3489bde42531a4fcab2b")}
12. > db.myCollection.find(); แสดงรายการข้อมูล
{ "_id" : ObjectId("5b2a3440bde42531a4fcab2a"), "x" : 1 }
{ "_id" : ObjectId("5b2a3489bde42531a4fcab2b"), "y" : 2 }
{ "_id" : ObjectId("5b2a35d9bde42531a4fcab2c"), "z" : 3 }
13. > exit
การเชื่อม PHP 5.6.3 + PHP_Mongo 1.6 + Mongodb 3.0.6 การเขียนโปรแกรมเชื่อมต่อ
https://www.thegeekstuff.com/2015/10/php-mongodb-for-xampp/
http://windows.php.net/downloads/pecl/releases/mongo/1.6.11/php_mongo-1.6.11-5.6-ts-vc11-x86.zip
การเชื่อม php_mongo 1.6 กับ php 5.6.3 [carlofontanos.com]
1. unzip php_mongo-1.6.11-5.6-ts-vc11-x86.zip
2. copy * จาก unzip ไปไว้ใน c:\xampp\php\ext
3. เปิดแฟ้ม php.ini ด้วย editor แล้วเพิ่ม "extension=php_mongo.dll"
4. สั่งรัน apache_start.bat
5. พิมพ์โค้ด <php phpinfo(); ?> ใน c:\xampp\htdocs\phpinfo.php เพื่อตรวจสอบว่า mongo ทำงานอยู่
6. กลับเข้า mongo
DOS> mongo
> use test
switched to db test
> show collections;
myCollection
> db.myCollection.find();
{ "_id" : ObjectId("5b2a3440bde42531a4fcab2a"), "x" : 1 }
{ "_id" : ObjectId("5b2a3489bde42531a4fcab2b"), "y" : 2 }
{ "_id" : ObjectId("5b2a35d9bde42531a4fcab2c"), "z" : 3 }

โปรแกรมเกี่ยวกับการ insert delete update var_dump
https://www.php.net/manual/en/class.mongocollection.php
<pre><?php
echo extension_loaded("mongo") ? "loaded\n" : "not loaded\n";
$dbhost = 'localhost';
$dbname = 'test';
$m = new Mongo("mongodb://$dbhost");
$db = $m->$dbname;
$col = $db->myCollection;
var_dump($col->findOne());  // เหมือนกับ (array('x' => 1))
echo "<hr/>";
$getdata = $col->findOne(array('x' => 1)); // 'y' =>2
/* array(2) {
["_id"]=>object(MongoId) {  ["$id"]=> string(24) "5f071b5a4ea9a4b3daacadf2" }
["x"]=> float(1) 
} */
var_dump($getdata);
echo "<hr/>";
echo $getdata{"_id"}; // 5f071b5a4ea9a4b3daacadf2
echo "<hr/>";
echo $getdata{"x"}; // 1
echo "<hr/>";
$getdata = $col->findOne(array('_id' => new MongoId('5f071b5a4ea9a4b3daacadf2')));
echo $getdata{"_id"}; // 5f071b5a4ea9a4b3daacadf2
echo "<hr/>";
echo $col->findOne(['z' => 3])['_id']; // 5f071b8e4ea9a4b3daacadf4
echo "<hr/>";
var_dump($col->findOne(['a' => 1])); // NULL เพราะไม่มี a = 1 มีแต่ x = 1
$col->insert(array('burin' => 123));
$arr = array('nation' => 456);
$col->insert($arr);
$batcharr = array();
$batcharr[] = array('nation' => 456);
$batcharr[] = array('sex' => 'male');
$batcharr[] = array('myid'=>1,'sex' => 'male');
$batcharr[] = array('myid'=>1,'myname'=>'burin','sex' => 'male');
$batcharr[] = array('x'=>1,'y'=>'2','z' => '3');
$col->batchInsert($batcharr); 
echo "<hr/>";
$docs = $col->find();
foreach ($docs as $doc) { var_dump($doc); }
echo "<hr/>". $col->count(array('x'=>1));
echo "<hr/>". $col->count(array('y'=>2)); // 0
echo "<hr/>". $col->count(array('x'=>1,'y'=>'2')); // เท่ากับ array('x'=>1)
echo "<hr/>". $col->count(); // 50 : ถ้าทั้งหมดมี 50 รายการ
// delete
$col->remove(array('x' => 1));
echo "<hr/>". $col->count(); // 49 : หายไป 1 รายการ
// update
$col->insert(array("name" => "yonok", "salary" => "1500" ));
var_dump($col->findOne(['name' => "yonok"]));
$newdata = array('$set' => array("salary" => "2000"));
$col->update(array("name" => "yonok"), $newdata);
var_dump($col->findOne(['name' => "yonok"]));
// $col->drop();
?>
9 ก.ค.63 PHP 7.3 + PHP-Mongodb 1.5.3 + Mongodb 4.2.8

เคยฟัง อ.เดวิด สมัญญากรณ์ พูดเรื่อง Big data เกี่ยวกับ 3Vs คือ ขนาด VOLUME ความเร็ว VELOCITY และ ความหลากหลาย VARIETY และวันนี้ (9 ก.ค.63) ได้ฟังผู้ปกครองนักเรียนท่านหนึ่งพูดถึงการลงทะเบียนเรียนวิชาเสริม แต่ลงไม่ได้เพราะเครื่องล้มซะก่อน แล้วได้อ่านเรื่อง Big Data ในเว็บไซต์ของ MongoDB และพบว่า Big Data มีบริการในหลายรูปแบบ อ่านเพิ่มที่ medium.com/bigdataeng จึงเป็นที่มาของการใช้ PHP 7.3 ติดต่อกับ MongoDB ซึ่งต่างจากที่ใช้ PHP 5.6.3 อยู่ไม่น้อย

การติดตั้งบน PHP 7.3 จะต่างไปจาก PHP 5.6.3
ตรวจสอบด้วย phpinfo();  ไม่พบการติดตั้ง extension ชื่อ mongodb
เปิดแฟ้ม php.ini ไม่พบ extension อ้างถึง mongo
เพิ่ม extension=php_mongodb.dll
---
ตรวจสอบในการจับคู่ที่เหมาะสม พบว่า PHP 7.3 x64 กับ Mongodb 1.5.3  และเลือกแบบ x64
** https://pecl.php.net/package/mongodb/1.5.3/windows
** https://windows.php.net/downloads/pecl/releases/mongodb/1.5.3/php_mongodb-1.5.3-7.3-ts-vc15-x64.zip
unzip แล้ว copy php_mongodb.dll เข้า /php/ext
C:\php>php -m | findstr mongodb พบ mongodb ใน extension ของ php แล้ว
---
ติดตั้ง Mongodb รุ่น 4.2.8
Menu bar, Software, Community Server, A free an open document database
Available Download 4.2.8 , Windows , msi
https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.8-signed.msi
install แบบ run service as network service user
Server name = MongoDB 
Data Directory = c:\program files\mongodb\server\4.2\data\
Log Directory =  c:\program files\mongodb\server\4.2\log
สำรวจใน C:\Program Files\MongoDB\Server\4.2\bin
พบในแฟ้ม C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg
กำหนดค่า dbPath: C:\Program Files\MongoDB\Server\4.2\data
---
เปิดโปรแกรมผ่านไอคอนบน desktop : C:\Users\LAB\AppData\Local\MongoDBCompassCommunity\MongoDBCompassCommunity.exe
แล้วสั่ง connect ก็ไม่ได้ พบ connect ECONNREFUSED 127.0.0.1:27017
---
DOS> services.msc  พบว่า MongoDB Server (MongoDB) ยังไม่ถูก start จึงต้อง start เอง
ตอนนี้ใช้ MongoDBCompassCommunity.exe เข้าจัดการข้อมูล แบบ Windows Mode ได้แล้ว
---
DOS> netstat -na | findstr 27017
TCP    127.0.0.1:27017        0.0.0.0:0              LISTENING
DOS> cd "C:\Program Files\MongoDB\Server\4.2\bin"
DOS> mongo
> db
test
> use test
switched to db test
> db.myCollection.insertOne({x:1});
{ "acknowledged" : true, "insertedId" : ObjectId("5f06e30e48bccb8a8dc5a3a6") }
> db.myCollection.find();
{ "_id" : ObjectId("5f06e30e48bccb8a8dc5a3a6"), "x" : 1 }
> exit
---
crud.php
เปิดโปรแกรม MongoDBCompassCommunity edit แล้ว copy connection ได้
// https://docs.mongodb.com/drivers/php
// https://www.tutorialspoint.com/mongodb/mongodb_php.htm
// https://stackoverflow.com/questions/40971613/class-mongodb-client-not-found-mongodb-extension-installed/41032582
<pre><?php
// https://www.tutorialspoint.com/mongodb/mongodb_php.htm
echo extension_loaded("mongodb") ? "loaded\n" : "not loaded\n";
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
// --- select
$query = new MongoDB\Driver\Query(array('x' => 1));
$cursor = $manager->executeQuery('test.myCollection', $query);
var_dump($cursor->toArray());
// Array ( [0] => stdClass Object ( [_id] => MongoDB\BSON\ObjectId Object ( [oid] => 5f06e30e48bccb8a8dc5a3a6 ) [x] => 1 ) )
// --- insert
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['6301' => 'a']);
$bulk->insert(['6302' => 'b','sex' => 'm']);
$bulk->insert(['6303' => 'c','sex' => 'f','score'=>2000]);
$bulk->insert(['6304' => 'd','score'=>1500]);
$manager->executeBulkWrite('test.myCollection', $bulk);
// เปิดด้วย MongoDBCompassCommunity.exe แล้ว reload data จะพบข้อมูลไหลเข้ามาแล้ว
$query = new MongoDB\Driver\Query(array('6303' => 'c'));
$cursor = $manager->executeQuery('test.myCollection', $query);
var_dump($cursor->toArray());
// -- update
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['6305' => 'b'],
    ['$set' => ['sex' => 'f']],
    ['multi' => false, 'upsert' => true]
);
// multi = false คือ พบตัวแรก ก็ทำตัวเดียว ไม่ทำหลายตัว Update only the first matching document
// upsert = true คือ ถ้าหาปรับปรุงไม่พบ ก็ insert เข้าไปเลย
$result = $manager->executeBulkWrite('test.myCollection', $bulk);
$query = new MongoDB\Driver\Query(array('6302' => 'b'));
$cursor = $manager->executeQuery('test.myCollection', $query);
var_dump($cursor->toArray());
// -- delete
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['6305' => 'b'], ['limit' => 1]); // ลบที่พบตัวเดียว
$bulk->delete(['6304' => 'd'], ['limit' => 0]); // ไม่จำกัด ลบที่พบทุกตัว
$result = $manager->executeBulkWrite('test.myCollection', $bulk);
// https://www.php.net/manual/en/mongodb-driver-manager.executequery.php
?>
---
การ config MongoDB ใน php สำหรับ XAMPP
https://www.thegeekstuff.com/2015/10/php-mongodb-for-xampp/
การติดตั้ง Mongodb ใน Xampp
https://carlofontanos.com/installing-mongodb-in-xampp-windows/
การติดตั้ง Mongodb ใน Xampp
https://www.kangaroomusique.de/2018/09/23/how-to-install-mongodb-on-windows-to-run-with-xampp/
Download Mongodb
https://www.mongodb.com/download-center
ใช้ dll ด้วยการ unzip php_mongodb.dll ใน C:\xampp\php\ext
https://learnedia.com/install-mongodb-configure-php-xampp-windows/
https://pecl.php.net/package/mongodb
หนังสือ Mongodb
https://www.php.net/manual/en/book.mongo.php
อ่านเรื่อง Mongodb กับ php กัน
https://www.tutorialspoint.com/mongodb/mongodb_php.htm

http://goo.gl/72BPC