MongoDB เปิดตัว MongoDB Atlas Data API รุ่น Preview มาให้เราสามารถส่งคำสั่ง CRUD กับ Database ได้ผ่าน REST API กันได้ตรงๆ ทำให้เราสามารถใช้งาน Database ได้โดยไม่ต้องอาศัย Driver เหมือนที่ผ่านมาได้ ขอเพียงแค่มี API Key เท่านั้นก็ใช้งานได้เลย
ก่อนหน้านี้เวลาเราจะเขียนโปรแกรมเพื่อติดต่อใช้งาน MongoDB เราต้องติดต่อผ่าน Driver และพึ่งพาให้ Driver ให้จัดการเรื่องต่างๆ อย่าง connection pooling, authentication, failover และเรื่องการแปลงข้อมูลไปมาระหว่าง BSON กับ Database เป็นต้น
การใช้งาน MongoDB แบบที่เราไม่ต้องจัดการติดตั้ง Database เอง ก็คือการใช้งานผ่านบริการของ MongoDB Atlas ที่เราสามารถติดต่อกับ Database ผ่านทาง Stitch แล้วต่อมาเราก็เปลี่ยนมาใช้ Realm อีกที ซึ่งหลังบ้านของ MongoDB Atlas นั้นก็เปิดให้เราสามารถเขียนโค้ดสำหรับการคำนวนบางอย่างฝากไว้ได้ ตั้งค่า Triggers และรวมถึงการสร้าง HTTPS Endpoints ได้เอง
มาถึงตอนนี้ ก็มีฟีเจอร์ใหม่ที่เรียกว่า Data API (ณ ตอนที่เขียนยังเป็นเวอร์ชั่น Preview) ที่ทำให้เราสารถส่งคำสั่ง CRUD ต่างๆ ไปยัง Database ได้เลยผ่านทาง REST API ตรงๆ โดยที่ไม่ต้องพึ่ง Driver และไม่ต้องใช้ SDK ใดๆ ใช้แค่ API KEY อย่างเดียวเท่านั้น
หลังจากที่เราสมัครใช้งาน MongoDB Atlas และสร้าง Database Cluster ไปแล้ว เราก็สามารถเปิดใช้งาน Data API ได้ทันทีจากเมนูทางซ้ายมือ
การเปิดใช้งาน Data API นั้นง่ายมาก แค่เข้าไปที่หน้า Dashboard แล้วเลือกเมนู Data API แล้วกดปุ่ม Enable ได้เลย จากนั้นก็ทำตามขั้นตอนไปเรื่อยๆ จนจบ เราจะได้ URL Endpoint มาไว้ใช้งาน
แล้วก็สร้าง API Key ที่ต้องเตือนไว้ก่อนว่า เราไม่ควรเอา API Key นี้ไปใช้งานกับ client ที่อยู่ฝั่ง end-user ที่เราไม่สามารถไว้วางใจได้ว่าจะปลอดภัย เพราะใครก็ตามที่มี API Key นี้อยู่ในมือจะสามารถ อ่าน/เขียน และเข้าถึงทุก collection ที่อยู่ใน cluster ได้เลย
เท่านี้เราก็สามารถใช้งาน Data API ได้แล้ว!
ลองใช้งาน MongoDB Atlas Data API
อย่างที่บอกไปแล้วตอนแรก ว่าการใช้งาน Data API ทั้งหมดจะใช้งานผ่าน REST API ดังนั้น เราสามาถส่ง HTTP Request ไปได้เลยตาม endpoint ต่างๆ ที่มีให้ ได้แก่
POST /action/findOne
POST /action/find
POST /action/insertOne
POST /action/insertMany
POST /action/updateOne
POST /action/updateMany
POST /action/replaceOne
POST /action/deleteOne
POST /action/deleteMany
POST /action/aggregate
จาก endpoint ที่ Data API มีมาให้ ก็พอจะเห็นภาพคร่าวๆ แล้วว่าทำให้เราจัดการกับ Data ได้ค่อนข้างครอบคลุมเลยทีเดียว ซึ่ง pattern ในการใช้งานแต่ละ endpoint นั้นจะเป็นการระบุ database, collection, และส่วนที่สัมพันธ์กับแต่ละ endpoint เช่น
Query หา document
curl --request POST \
'https://data.mongodb-api.com/app/<Data API App ID>/endpoint/data/beta/action/findOne' \
--header 'Content-Type: application/json' \
--header 'Access-Control-Request-Headers: *' \
--header 'api-key: <Data API Key>' \
--data-raw '{
"dataSource": "Cluster0",
"database": "todo",
"collection": "tasks",
"filter": {
"text": "Do the dishes"
}
}'
Insert document
curl --request POST \
'https://data.mongodb-api.com/app/<Data API App ID>/endpoint/data/beta/action/insertOne' \
--header 'Content-Type: application/json' \
--header 'Access-Control-Request-Headers: *' \
--header 'api-key: <Data API Key>' \
--data-raw '{
"dataSource": "Cluster0",
"database": "todo",
"collection": "tasks",
"document": {
"status": "open",
"text": "Do the dishes"
}
}'
และสิ่งที่ผมคิดว่าเป็นไฮไลท์เลยก็คือเราสามารถส่ง Aggregation Pipeline ได้เลยแบบนี้
curl --request POST \
'https://data.mongodb-api.com/app/<Data API App ID>/endpoint/data/beta/action/aggregate' \
--header 'Content-Type: application/json' \
--header 'Access-Control-Request-Headers: *' \
--header 'api-key: <Data API Key>' \
--data-raw '{
"dataSource": "Cluster0",
"database": "todo",
"collection": "tasks",
"pipeline": [
{
"$group": {
"_id": "$status",
"count": { "$sum": 1 },
"text": { "$push": "$text" }
}
},
{ "$sort": { "count": 1 } }
]
}'
สิ่งที่ Data API ทำให้เราไม่ได้ แบบเดียวกับการใช้ Driver ที่เห็นได้ชัดที่สุดก็คือเราสามารถเข้าถึงและทำทุกอย่างได้โดยใช้แค่ API Key เท่านั้นโดยไม่ได้มีการจำกัดสิทธิ์ของ client แต่อย่างใด หวังว่าในอนาคตหากหมดช่วง Preview ไปแล้ว เราจะสามารถสร้าง API Key ที่ระบุสิทธิ์ในการเข้าถึง resource ต่างๆ ลงไปได้ด้วย
ที่มา: Read and Write with the Data API (Preview)