MongoDB Command



              เอาละมาเริ่มต้นการใช้งานฐานข้อมูล MongoDB กันดีกว่า เอาจริงๆ ก็แปลกใจเหมือนกัน ชื่อ มะม่วง แต่โลโก้รูปใบ สงสัยจะเป็นใบมะม่วงมั้ง แต่แบบนี้มันก็ไม่ได้มีจุดเด่นที่แตกต่างกับใบไม้อย่างอื่นเท่าไหร่อะนะ อืม.. ช่างมันเถอะ เข้าสู่การใช้คำสั่งกันดีกว่า

  1. เนื่องจากเราลองลงใน virtual machine หรือคอมส่วนตัวของเราที่ไม่ใช่เซิฟเวอร์กันจริงๆ นะครับ เมื่อเราปิด-เปิดคอม รึรีสตาร์ทเครื่อง ตัว MongoDB จะหยุดทำงานนะครับ ให้ใช้คำสั่ง  sudo systemctl start mongod หรือ sudo service mongod start  ใน terminal ใหม่อีกครั้งเพื่อสั่งให้ฐานข้อมูลเริ่มทำงาน
  2. ใช้คำสั่ง  mongo เพื่อเข้าใช้งานฐานข้อมูลนะครับ 
  3. show dbs อันนี้ไว้โชว์ฐานข้อมูลทั้งหมดที่มีนะครับ ซึ่งมันจะมีมาให้ก่อน 3 อัน คือ admin, config, local ซึ่งยังไม่มีข้อมูลอะไรเลย
  4. use NameDataBase อันนี้ไว้ใช้เข้าฐานข้อมูลนะครับ กรณีที่ไม่มีชื่อที่ตรงกับ NameDataBase ที่เรียกจะทำการสร้างฐานข้อมูลใหม่ (แต่จะเรียกยังไม่เห็นใน show dbs จนกว่าเราจะเริ่มสร้างข้อมูลภายในนะครับ)
  5. db เอาไว้ใช้เช็คว่าตอนนี้เราอยู่ที่ฐานข้อมูลตัวไหนนะครับ 
  6. การเพิ่มข้อมูลในดาต้าเบสนะครับ ให้ใช้  use  NameDataBase กลับเข้าไปในฐานข้อมูลตัวที่ต้องการนะครับ เราจะเริ่มสร้าง collection ด้วยการใส่ข้อมูลเข้าไปเลยนะครับ (แบบสร้างขึ้นมาก่อนก็มีนะ ใช้คำสั่ง db.createCollection("NameCollection") และยังสามารถเพิ่ม option การกำหนดขนาดของฐานข้อมูลได้ แต่เราไม่ได้ต้องการกำหนดอะไรแบบนั้นนะครับ) ของเราให้ใช้คำสั่งตามนี้นะครับ (*หมายเหตุ space bar หรือการเว้นวรรค นับเป็นหนึ่งอักษรนะครับ)
    • db.test.insertOne({"NAME":"valenteer","ADDRESS":"world"}) เพื่อใส่ข้อมูลเข้าไปโดย test คือชื่อของ collection นะครับ (น่าจะเหมือน table ใน sql) ส่วน  NAME , ADDRESS เป็นหัวคอลัมภ์ (ใน MongoDB เรียกฟิลด์(field) เราเรียกหัวคอลัมภ์ให้คุ้นเคยกับคนที่ใช้ excel ละกัน) นะครับ และ  valenteer ,  world คือข้อมูลที่ต้องการจะใส่นะครับ  
    • db.test.insertMany([{"NAME":"test1","NUMBER":1},{"NAME":"test2","NUMBER":2}]) อันนี้ไว้ใส่ข้อมูลมากกว่าหนึ่ง row นะครับ ตรงคอลัมภ์ NUMBER ค่าที่ใส่เมื่อเราต้องการเป็นตัวเลข (int หรือ float) ต้องไม่ใส่ " " นะครับ ไม่งั้นจะเป็นตัวอักษรซึ่งใช้เงื่อนไข มากกว่า น้อยกว่า ในการหาข้อมูลไม่ได้
  7. show collections เราจะเห็นมีชื่อ test ขึ้นมานะครับ เนื่องจากเราใส่ข้อมูลเข้าไปแล้วมันจึงสร้าง collection และฐานข้อมูลที่ชื่อ  test ให้เรานะครับ
  8. db.test.find() ใช้คำสั่งนี้เพื่อที่จะดูข้อมูลทั้งหมดที่อยู่ใน collection ที่เราเลือกนะครับ 
  9. db.test.find({"NAME":"valenteer"}) อันนี้ใช้เพื่อระบุคอลัมภ์ และชนิดของข้อมูลที่ต้องการหานะครับ ถ้าเราเพิ่มเป็น  db.test.find({"NAME":"valenteer" ,"ADDRESS":"world"})  จะเป็นการหาข้อมูลในลักษณะเชื่อมด้วย and นะครับ คือต้องตรงกันทั้งหมดถึงจะแสดงผลให้นะครับ ซึ่งเงื่อนไขอื่นๆ สามารถดูเพิ่มเติมได้ ที่นี้ นะครับ ที่น่าจะได้ใช้บ่อยก็คงเป็น (เงื่อนไขคือส่วนสีเขียวนะครับ)
    • *tip&trick คำสั่งแสดงผลการค้นหาทั้งหมดข้างล่างสามารถเติม .pretty() ให้มันแบ่งบรรทัดเพื่อความสวยงาม และความง่ายในการดูข้อมูลได้นะครับ เช่น db.test.find({"NUMBER":{$lt:1}}).pretty()  นะครับ แล้วในส่วนของคำสั่งอื่นๆ ที่ใช้บ่อย ดูเพิ่มเติมได้ที่นี้ นะครับ
    • db.test.find({"NAME":{$in:["test1","test2"]}}) ซึ่ง in เหมือนการใช้เงื่อนไข or นะครับ ถ้าคอลัมภ์ NAME มีค่า test1 หรือ test2 ค่าใดค่าหนึ่งจะแสดงผลให้เห็น 
    • db.test.find({"NAME":{$nin:["test1","test2"]}}) อันนี้ nin มาจาก not in นะครับ เงื่อนไข or เหมือนกัน แต่จะไม่แสดงผลข้อมูลที่ต้องตามเงื่อนไข เช่นถ้าคอลัมภ์ NAME มีค่า test1 หรือ test2 จะไม่แสดงผล นอกนั้นแสดงผลทั้งหมด
    • db.test.find({"NUMBER":{$exists:true,$ne:null}}) อันนี้ exists คือแสดงทุกอันที่มีคอลัมภ์ NUMBER และไม่ใช่ค่าว่าง (ne)bนะครับ
    • db.test.find({"NUMBER":{$gt:1}}) เงื่อนไขคือ แสดงแถวของคอลัมภ์ที่ค่า NUMBER > 1 นะครับ
    • db.test.find({"NUMBER":{$gte:1}}) เงื่อนไขคือ แสดงแถวของคอลัมภ์ที่ค่า NUMBER >= 1 นะครับ
    • db.test.find({"NUMBER":{$lt:1}}) เงื่อนไขคือ แสดงแถวของคอลัมภ์ที่ค่า NUMBER < 1 นะครับ
    • db.test.find({"NUMBER":{$lte:1}}) เงื่อนไขคือ แสดงแถวของคอลัมภ์ที่ค่า NUMBER <= 1 นะครับ
    • ข้างบนจะเป็นการใช้เงื่อนไขเดียวนะครับ ทีนี้มาต่อกันแบบสองเงื่อนไข อันแรกคือ and ตัวอย่างคำสั่ง db.test.find({$and:[{"NAME":{$nin:["valenteer"]}},{"NUMBER":{$gt:3}}]}) ซึ่งพอมีเงื่อนไขข้างในแล้วเราต้องใช้นะครับ ไม่เหมือนตอนแรกที่เราระบุตรงๆ (ถ้าไม่มีจะขึ้นเออเรอร์นะครับ)
    • db.test.find({$or:[{"NAME":{$in:["test1","test2"]}},{"NUMBER":{$in:[2]}}]}) อันนี้ขอแค่ตรงเงื่อนไขอันใดอันหนึ่ง ก็จะแสดงผลข้อมูลออกมานะครับ (คล้าย in)
    • db.test.find({$nor:[{"NAME":{$in:["test1","test2"]}},{"NUMBER":{$in:[2]}}]}) อันนี้ต้องไม่ตรงเงื่อนไขอันใดอันหนึ่งในนี้ ถึงจะแสดงผลข้อมูลออกมานะครับ (คล้าย nin) มี not อีกคำสั่งนะครับ แต่มันจะแสดงผลของข้อมูลที่ไม่ตรงกับเงื่อนไขทั้งหมด รวมถึง ที่ไม่มีคอลัมภ์นั้นๆ ด้วย
    • db.test.find({"NUMBER": { $type: "double"}}) อันนี้ใช้ค้นหาตามชนิดข้อมูลนะครับ เนื่องจาก MongoDB เป็น nosql ซึ่งใส่ข้อมูลคนละ type ในชื่อคอลัมภ์เดียวกันก็ได้ ดังนั้นเราจึงสามารถค้นหามันตามชนิดของข้อมูลได้เช่นกัน (ดู type ของ MongoDB ได้ที่นี้ ครับ)
    • db.test.find({"NAME": {$regex: '.es.'}}) อันนี้ใช้ค้นหาบางส่วนของข้อมูลนะครับ อย่างในนี้คือ ขอแค่มีตัวอักษร es ข้างหน้า-ข้างหลัง ก็ให้แสดงผลออกมานะครับ
    • db.test.find({"ADDRESS":{$ne:null}},{"NAME":1}) การเลือกแสดงผลเฉพาะคอลัมภ์ที่เราเลือกคือ NAME (0 ไม่แสดงผล, 1 แสดงผล) ของคนที่มีคอลัมภ์ ADDRESS และมีข้อมูลข้างในนะครับ
  10. มาเข้าสู่การเก็บดาต้าแบบ Object กันครับ ลองใช้คำสั่ง add ข้อมูลเพิ่มตามนี้ db.test.insertOne({NAME:"liria",TEL:{MOBILE:"01234",HOME:"5678"}}) นะครับ ทีนี้มาในส่วนของคำสั่งอื่นที่เกี่ยวข้อง
    • db.test.find({TEL.HOME:"5678"}) จะต่างกับปกติที่เพิ่มหัวคอลัมภ์ย่อยใน Object ตรง TEL.HOME มานะครับ ซึ่งนอกนั้นก็จะเหมือนปกติ
    • db.test.find({ "TEL": { $all: [{"MOBILE":"01234","HOME":"5678"}]}}) อันนี้จะแสดงเฉพาะที่ใน Object มีข้อมูลตรงตามเงื่อนไขเราทั้งหมด เหมือน and นะครับ
  11. ต่อด้วยการเก็บดาต้าแบบ Array ซึ่งการเขียนการอ่านแบบ Object มันดีกว่าแหละ แต่ Array จะสะดวกในการจัดการเรื่องตัวเลขมากกว่า ลองใช้คำสั่ง add ตามนี้ครับ db.test.insertOne({NAME:"test",EMAIL:["valenteer@prontera.com",1234]}) จะเห็นว่ามันเอาข้อมูลเข้าได้แบบต่าง type กันได้นะครับ
    • db.test.find({"EMAIL" : 1234}); จะเห็นว่าเราไม่ต้องระบุหัวคอลัมภ์ย่อยเหมือนแบบ Object นะครับ มันจะเข้าไปไล่เช็คมาเอง แต่ก็นั้นละ ถ้า Array มีข้อมูลเยอะๆ มันก็น่าจะช้าลงเป็นธรรมดาครับ
    • db.test.find({ "EMAIL": { $all: ["valenteer@prontera.com",1234]}}) อันนี้จะแสดงเฉพาะที่ใน Array มีข้อมูลตรงตามเงื่อนไขเราทั้งหมด เหมือน and นะครับ (สามารถตัด $all ออกให้เหลือ db.test.find({ "EMAIL": ["valenteer@prontera.com",1234]}) ก็ได้นะครับ)
    • db.test.find({ "EMAIl": { $size: 2}}) อันนี้จะแสดง Array ที่ชื่อคอลัมภ์ EMAIL และมีจำนวนข้อมูลข้างใน 2 ข้อมูลนะครับ
    • db.test.find({ "EMAIL": { $elemMatch: {$gt: 1000, $lt: 2000}}}) อันนี้ต้องการให้แสดงผล Array ที่มีข้อมูลในเงื่อนไขที่กำหนด อย่างน้อยหนึ่งข้อมูลนะครับ ซึ่ง 1234 ก็จะยังอยู่ในช่วงที่มากกว่า 1000 และน้อยกว่า 2000 ดังนั้นก็จะแสดงผล (คล้าย or)
  12. การอัพเดตข้อมูลนะครับ
    • db.test.updateOne({"NAME":"valenteer"},{$set:{"NAME":"liria"}}) เป็นการอัพเดตข้อมูลเดียวนะครับ ซึ่งข้อมูลเดิมเราจะมีข้อมูลคนที่ชื่อ valenteer อยู่ใน collection นะครับ แต่เนื่องจากคำสั่งนี้จะบอกให้หาคนชื่อ valenteer แล้วเปลี่ยนชื่อเป็น liria นะครับ ดังนั้นเมื่อเราใช้คำสั่ง เราจะพบว่าข้อมูลของ ได้เปลี่ยนเป็นของคนชื่อ liria แล้ว ส่วน _id จะยังเหมือนเดิมนะครับ (กรณีตรงเงื่อนไขมากกว่าหนึ่งจะอัพตัวที่มี _id เลขน้อยสุดนะครับ ซึ่งไม่แนะนำให้ใช้เงื่อนไขที่ไม่เจาะจงกับคำสั่งนี้นะครับ)
    • db.test.updateMany({"NAME":{$regex: '.es.'}},{$set:{"NUMBER":3}}) เป็นการอัพเดตข้อมูลพร้อมกันหลายตัวนะครับ ซึ่งข้อมูลเดิมเราจะมีข้อมูล "NAME": ที่มีค่าเป็น "test","test1"."test2" ที่ตรงเงื่อนไขนะครับ ดังนั้นทั้งหมดจะมีการอัพเดต ส่วนข้อมูลไหนที่ไม่มีคอลัมภ์นี้ก็จะถูกเพิ่มเข้าไปนะครับ
    • db.test.replaceOne({"NAME":"test"},{NAME:"test",EMAIL:["valenteer@prontera.com",1234]}) เป็นการแทนที่ข้อมูลเก่าที่ตรงเงื่อนไข ด้วยข้อมูลใหม่ทั้งหมดนะครับ จากที่เราเคยอัพเดตเพิ่มคอลัมภ์ "NUMNER":3 ไว้ ตอนนี้มันก็จะหายไปนะครับ เพราะเราแทนที่ด้วยข้อมูลเดิม
    • db.test.update({"NAME":"liria"},{$set:{"TEL.WORK":"5678"}}) อันนี้สำหรับใส่ข้อมูลเพิ่มใน Object นะครับ
    • db.test.update({"NAME":"test"},{$push:{ "EMAIL":5678}},{multi:true}) อันนี้สำหรับใส่ข้อมูลเพิ่มใน Array นะครับ
  13. การ backup ข้อมูลนะครับ (ไม่ต้องเข้าไปข้างในฐานข้อมูลนะครับ คำสั่งอื่นดูที่นี้) ใช้คำสั่ง
    • mongodump สำหรับ backup ข้อมูลทั้งหมดนะครับ ซี่งข้อมูลจะอยู่ในโฟลเดอร์ชื่อ dump/ ของ home ของเรานะครับ
    • mongodump --db=test สำหรับ backup ฐานข้อมูลที่ชื่อ test นะครับ
    • mongodump --db=test --collection=test สำหรับ backup ฐานข้อมูลที่ชื่อ test เฉพาะ collection test นะครับ
    • กรณีต้องการเปลี่ยน path ขอโฟลเดอร์ที่จะ backup ข้อมูลให้ใช้คำสั่ง mongodump --out=/home/UserName/mongoDBbackup/mongodump_2021_7_24 นะครับ โดย UserName เป็นชื่อของ user ผู้ใช้ของเรานะครับ และ mongoDBbackup/mongodump_2021_7_24 คือโฟลเดอร์ที่เราต้องการเก็บไฟล์ backup
    • mongorestore dump/ สำหรับ restore backup ฐานข้อมูลนะครับ ถ้ายังมีข้อมูลอยู่มันจะไม่เขียนทับ _id เดียวกันนะครับ ถึงแม้ว่าข้อมูลข้างในจะไม่เหมือนกันแล้วก็ตาม (ถ้าเก็บไฟล์ backup ไว้ที่โฟลเดอร์อื่น อย่าลืมแก้ตรง dump/ นะครับ) และสามารถกำหนด --db เพื่อระบุฐานข้อมูลที่จะ restore ได้เช่นกัน (Ex mongorestore --db=test dump/test)
  14. การลบดาต้านะครับ ใช้คำสั่ง
    • db.test.deleteOne({"NAME":"valenteer"}) สำหรับลบข้อมูลที่ตรงเงื่อนไขตัวเดียว โดยจะลบทุกคอลัมภ์นะครับ (เรียกว่าการลบ document)
    • db.test.deleteMany({"NAME":"liria"}) สำหรับลบทุกตัวที่ตรงตามเงื่อนไข และลบทุกคอลัมภ์เช่นกัน (ลบ document)
    • db.test.updateOne({"NAME":"test1"},{$unset:{"NUMBER":3}}) เป็นการอัพเดตที่ต้องการลบคอลัมภ์ "NUMBER" ของ "NAME" ที่ตรงตามเงื่อนไขออกนะครับ หรือใช้คำสั่ง db.test.updateOne({"NAME":"test1"},{$unset:{"NUMBER":{$exists:true,$ne:null}}}ลบคอลัมภ์ "NUMBERโดยไม่สนว่ามีอะไรข้างในนะครับ
    • db.test.updateOne({"NAME":"liria"},{$unset:{"TEL.HOME":{$exists:true,$ne:null}}}) (ใครลบไปแล้วกลับไปใส่คืนตามข้อ 10. นะครับ) เป็นการอัพเดตที่ต้องการลบคอลัมภ์ "TEL.HOME" (สำหรับข้อมูลแบบ Object) ของ "NAME" ที่ตรงตามเงื่อนไขออกนะครับ
    • db.test.update({"NAME":"test"},{$pull:{ "EMAIL":1234}},{multi:true}) อันนี้สำหรับลบข้อมูลใน Array นะครับ
    • db.test.drop() อันนี้ไว้ลบได้ทั้งฐานข้อมูล และ collection นะครับ โดยจะลบอันบนสุดก่อน ดังนั้นฐานข้อมูลที่ชื่อ test จะถูกลบนะครับ (ไม่ควรตั้งชื่อฐานข้อมูลกับ collection ซ้ำกัน ป้องกันการลบผิดพลาด)
  15. อันนี้เป็นคำสั่งที่อาจจะได้ใช้ในงานนะครับ คงใช้ไม่ค่อยบ่อยแค่รวบรวมเผื่อไว้ก่อน
    • db.test.count() อันนี้ไว้จำนวน row ของข้อมูลทั้งหมดนะครับ
    • db.test.dataSize() อันนี้ไว้แสดงขนาดของ collection
    • db.test.storageSize() อันนี้แสดงขนาดไบต์ข้อมูลทั้งหมดของ collection (รวม index)
    • db.test.renameCollection("testRename") อันนี้ไว้ใช้เปลี่ยนชื่อของ collection จาก test เป็น testRename นะครับ แต่เราจะยังใช้ชื่อ test เหมือนเดิมนะครับ ถ้าเปลี่ยนแล้วอย่าลืมเปลี่ยนชื่อกลับคืนด้วยนะครับ
    • db.test.insertOne({"DATE":Date()}) อันนี้ไว้ใส่เวลา ณ ตอนนั้น นะครับ
    • db.test.find({"NUMBER" : {$ne:null}}).sort({NUMBER:1}) อันนี้ไว้จัดเรียงข้อมูลที่ของเราต้องการนะครับ จากคำสั่งคือหาข้อมูลในคอลัมภ์ NUMBER ที่มีข้อมูล แล้วเรียงให้ด้วย ซึ่งตรงคอลัมภ์ที่ค้น กับคอลัมภ์ที่ใช้เรียงจะเป็นคนละคอลัมภ์ก็ได้นะครับ
    • db.test.find().limit(2) อันนี้ไว้แสดงผลข้อมูลที่เราต้องการแบบจำกัดจำนวนนะครับ ตัวอย่างนี้คือแสดงผลแค่ 2 บรรทัดแรกนะครับ
    • db.test.find().skip(1อันนี้เอาไว้ข้ามบรรทัดที่เราต้องการนะครับ ในตัวอย่างคือข้าม 1 บรรทัดแรก (ยังคิดไม่ออกว่าจะไว้ใช้ทำอะไร แปะไว้ก่อน)












ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

โปรโมชั่นเน็ต TOT

โน๊ตบุ๊ค acer switch sa5-271 แบตบวม T^T

Blog นี้สร้างเพื่อ?