MongoDB รองรับการเก็บฟังก์ชัน JavaScript ไว้ในระบบ (Stored Procedures) ในคอลเลกชันพิเศษ system.js
Syntax การบันทึกฟังก์ชัน
db.system.js.save({
_id: "functionName",
value: function (param) {
return 'message ' + param;
}
})
ตัวอย่าง: บันทึกฟังก์ชัน returnValue
> db.system.js.save({
... _id: "returnValue",
... value: function (data) {
... return 'The value==== ' + data;
... }
... });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
เรียกใช้ฟังก์ชันด้วย db.eval() (Deprecated)
> db.eval("returnValue(20)");
WARNING: db.eval is deprecated
ผลลัพธ์:
The value==== 20
⚠️ ข้อควรระวังสำคัญ
- db.eval() ถูก Deprecated ตั้งแต่ MongoDB 3.0 และลบใน 4.2+
- Stored JS ไม่แนะนำให้ใช้ใน Production เพราะ:
- Lock database ขณะรัน (Global write lock ในรุ่นเก่า)
- ไม่รองรับ Sharding
- Security risk (JavaScript injection)
- Performance แย่กว่า Native operations
- MongoDB ไม่ใช่ RDBMS - ไม่ควรย้าย Business Logic มาใส่ใน DB
ทางเลือกที่ดีกว่า
- ประมวลผลใน Application Layer (Node.js, Python, Java, etc.)
- ใช้ Aggregation Pipeline ($function ใน MongoDB 4.4+ สำหรับ custom logic)
- ใช้ Atlas Triggers / Realm Functions สำหรับ Server-side logic
ดูฟังก์ชันที่เก็บไว้
db.system.js.find();
ลบฟังก์ชัน:
db.system.js.remove({_id: "functionName"});