ช่วงนี้กล่องสุ่มกำลังเป็นเทรนด์ฮิตเลยครับ ถ้าจู่ๆ เราต้องมาทำระบบกล่องสุ่มโดยที่ข้อมูลกล่องสุ่มมีการเตรียมไว้อยู่แล้ว เราสามารถทำได้ง่ายๆ เลยได้มั้ย
คำตอบก็คือง่ายมาก เพราะในที่นี้ตัว MongoDB มีความสามารถในการสุ่ม document จาก collection อยู่แล้ว ผ่าน aggregation นั่นเอง
Aggregate $sample
รูปแบบของการสุ่มนั้น เราสามารถใช้กับ collection ที่เตรียมข้อมูลไว้แล้วได้ (แน่นอนว่าในที่นี้ไม่ได้เป็นการสุ่มเอาของมาใส่กล่องเป็นรายๆ ไปนะ) โดยการใช้ $sample
db.randomBoxes.aggregate([{ $sample: { size: 1 } }])
ซึ่งตัว $sample สามารถใส่กำหนดจำนวนสุ่มได้ด้วยนะ นั่นก็คือ size นั่นเอง โดยถ้าต้องการสุ่มออกมาจำนวนเท่าไหร่ ก็สามารถกำหนดเป็นจำนวนตัวเลขนั้นลงไปได้
นอกเหนือจากนั้น เรายังสามารถเอา $match มาใช้งานร่วมด้วย เพื่อให้กำหนดเงื่อนไขในการได้กล่องสุ่มตามที่กำหนดไว้มาอีก
db.randomBoxes.aggregate([
{ $match: { /* กำหนดเงื่อนไขลงไปเลยจ้า */ } },
{ $sample: { size: 1 } }
])
วิธีทำกล่องสุ่มใน Mongoose
และถ้าเราต้องการเอามาใช้ใน Mongoose หรือโปรเจค Node.js ก็สามารถทำได้ง่ายๆ แบบด้านล่างนี้
// สร้าง schema และ model ก่อน
const boxSchema = new mongoose.Schema({
...
})
const boxModel = mongoose.model('Box', boxSchema)
// จากนั้นเรียกใช้ Aggregate function ได้จาก model เลย
// random box คือกล่องที่สุ่มได้ออกมาจ้า
const randomBox = await boxMode.aggregate([
{ $sample: { size: 1 } }
])
ซึ่งเทคนิคนี้สามารถเอาไปใช้กับฐานข้อมูลแบบ NoSQL ได้ รวมไปถึง Azure Cosmos DB ครับ