จากคอร์ส Mongoose for Web Developer เช่นเคยนะครับ พอดีส่วนนี้น่าสนใจ เพราะมีคนถามกันเข้ามาเยอะ เลยเอามาเขียนเป็น blog ไว้ จะได้หาอ้างอิงกันได้ง่ายๆ ครับ
คือเหตุจากที่ว่าตอนเราออกแบบ Schema Modeling (คอร์สแยกจาก Mongoose อีกที) เรามีหลักการที่ว่า เราสามารถเลือกเก็บข้อมูลสำคัญในตัว collection ใน document ได้ เมื่อมันรองรับเป้าหมายในการใช้งาน (The purpose of document) แต่ถ้าเราจะเอามาเขียนใช้งานจริงใน Mongoose จะทำยังไง มาดูกันเลย
เวอร์ชั่นนี้เขียนแบบ TypeScript นะ
โดยในที่นี้ เราจะมีตัวอย่างคือ
สินค้าขายดีในร้าน 1 ร้าน
- ก็จะมีข้อมูล 2 ตัว คือ ร้าน และสินค้าที่ขายดี
- เราจะมี document ของร้าน และมี sub collection คือสินค้าที่ขายดีครับ
1. สร้าง schema สำหรับ document ที่เป็นตัวแทนสินค้า
เราจะสร้าง schema ของสินค้าขึ้นมาก่อน เอาง่ายๆ เลยก็มีแค่ชื่อสินค้าแล้วกัน
import { Schema, model } from 'mongoose'
export interface IProduct {
name: String
}
export const productSchema = new Schema({
name: String
})
export default model<IProduct>('Product', productSchema)
2. นำมาใช้กำหนดเป็น sub collection ใน schema ของ document ที่เป็นตัวแทนของร้านค้า
ซึ่ง Interface ของสินค้า และ Schema ของสินค้า จะถูกนำมาใช้ในการกำหนดในส่วนของข้อมูล Store
- Interface ของสินค้า จะถูกใช้กำหนดเป็น Type ของ Array ใน Interface ของร้านค้า
- ส่วนของ schema ของสินค้า จะถูกใช้ใน schema ของร้านค้าตามปกติเลย
import { IProduct, productSchema } from './product';
import { Schema, model } from 'mongoose'
interface IStore {
name: String
// ส่วนที่ map กับ interface จะใช้ Interface เหมือนกัน โดยกำหนดเป็น type ของ Array
featuredProduct: Array<IProduct>
}
const storeSchema = new Schema({
name: String,
// ส่วนที่เป็น schema จะเป็นการกำหนดสร้าง array และใส่ schema ของสินค้าลงไป
featuredProduct: [productSchema]
})
export default model<IStore>('Store', storeSchema)
ส่วนเหตุผลที่ว่าทำไม design แบบ sub-collection ไม่แยกเป็น collection ต่างหากเลย ใครเรียนไปแล้ว ทบทวนได้ในส่วนของวิดีโอในคอร์ส Schema Modeling for NoSQL Database นะ