Express æå¸ 3ï¼ä½¿ç¨è³æåº«ï¼Mongooseï¼
æ¬æç°¡çä»ç´¹æ¸æåº«ï¼ä»¥åå¦ä½æé Node / Express æç¨ï¼ä½¿ç¨æ¸æåº«ãæ¥ä¸ä¾ææ¼ç¤ºæåå¦ä½ä½¿ç¨ Mongooseï¼çºæ¬å°åæ¸é¤¨æä¾æ¸æåº«ååãæ¬æèªªæç©ä»¶è¦æ±è模åå¦ä½å®£åï¼ä¸»è¦çæ¬ä½åæ ï¼ä»¥ååºæ¬é©èãæ¬æä¹ç°¡çæ¼ç¤ºä¸äºå忍¡åæ¸æçä¸»è¦æ¹æ³ã
| åç½®æ¢ä»¶: | Express æå¸ 2: åµå»ºä¸å骨æ¶ç¶²ç« |
|---|---|
| ç®æ¨: | è½å¤ 使ç¨Mongooseè¨è¨ä¸¦åµé èªå·±ç模åã |
æ¦è¦½
忏餍è·å¡æä½¿ç¨æ¬å°åæ¸é¤¨ç¶²ç«ï¼åæ¾æ¸æ¬å忏è è¨æ¯ãåæ¸é¤¨ä½¿ç¨è æç¨ç¶²ç«ç覽èå°æ¾æ¸æ¬ï¼ççæ¯å¦æå¯ä»¥èé±çæ¸æ¬è¤æ¬ï¼ç¶å¾é ç´æè èé±ãçºäºææçå°åæ¾èåç¨è¨æ¯ï¼æåå°æå®åæ¾å°æ¸æåº«ã
Express æç¨å¯ä»¥ä½¿ç¨è¨±å¤ä¸åçæ¸æåº«ï¼ä¸¦ä¸æå¥½å¹¾ç¨®æ¹æ³å¯ä»¥å·è¡åµå»º Createãè®å Readãæ´æ° Update ååªé¤ Delete (CRUD) æä½ãæ¬æç¨çºä¸äºå¯ç¨çé¸é ï¼æä¾ç°¡ççæ¦è¦½ï¼ç¶å¾æ¥è詳細æ¼ç¤ºè©²é¸é çç¹å®éè¡æ©å¶ã
æå¯ä»¥ä½¿ç¨ä»éº¼æ¸æåº«?
Express æç¨ç¨åºå¯ä»¥ä½¿ç¨ Node æ¯æç任使¸æåº«ï¼Express æ¬èº«ä¸æçºæ¸æåº«ç®¡çï¼å®ç¾©ä»»ä½ç¹å®çéå è¡çº/è¦æ±ï¼ãæè¨±å¤æµè¡çé¸é ï¼å æ¬ PostgreSQLï¼MySQLï¼Redisï¼SQLite å MongoDBã
å¨é¸ææ¸æåº«æï¼ä½ æè©²èæ ®æé - çç¢å/å¸ç¿æ²ç·ï¼æ§è½ï¼æè¤è£½/åä»½ï¼ææ¬ï¼ç¤¾åæ¯æççãéç¶æ²æå®ä¸ç ãæä½³ã æ¸æåº«ï¼ä½å¹¾ä¹ä»»ä½æµè¡çè§£æ±ºæ¹æ¡ï¼æåçæ¬å°åæ¸é¤¨é樣çä¸å°åç¶²ç«ï¼æè©²é½å¯ä»¥æ¥åã
æéé¸é çæ´å¤è¨æ¯ï¼è«åé±ï¼æ¸æåº«éæï¼Express docsï¼ã
èæ¸æåº«äºåçæå¥½æ¹å¼æ¯ä»éº¼?
æå ©ç¨®èæ¸æåº«äºåçæ¹æ³ï¼
- ä½¿ç¨æ¸æåº«çåçæ¥è©¢èªè¨ï¼ä¾å¦ SQLï¼
- 使ç¨å°åæ¸ææ¨¡åï¼ãODMãï¼/å°è±¡éä¿æ¨¡åï¼ãORMãï¼ã ODM / ORM å°ç¶²ç«çæ¸æè¡¨ç¤ºçº JavaScript å°è±¡ï¼ç¶å¾å°å ¶æ å°å°åºå±¤æ¸æåº«ãä¸äº ORM ç¶å®å°ç¹å®çæ¸æåº«ï¼èå¦ä¸äºåæä¾äºä¸åä¸ç¹å®æ¸æåº«çå¾ç«¯ã
ééä½¿ç¨ SQL ææ¸æåº«æ¯æç任使¥è©¢èªè¨ï¼é½å¯ä»¥ç²å¾æä½³æ§è½ã ODM é常æ¯è¼æ ¢ï¼å çºå®å使ç¨ç¿»è¯ä»£ç¢¼ï¼å¨å°è±¡åæ¸æåº«æ ¼å¼ä¹éé²è¡æ å°ï¼éå¯è½ä¸æä½¿ç¨æææçæ¸æåº«æ¥è©¢ï¼å°¤å ¶æ¯å¦æ ODM æ¯æä¸åçæ¸æåº«å¾ç«¯ï¼ä¸¦ä¸å¿ é å¨å忏æåº«ææ¯æçåè½æ¹é¢ï¼ååºæ´å¤§çæè¡·ï¼ã
ä½¿ç¨ ORM çå¥½èæ¯ï¼ç¨åºå¡å¯ä»¥ç¹¼çºç¨ JavaScript å°è±¡è䏿¯æ¸æåº«èªç¾©ä¾æè â å¦æä½ éè¦ä½¿ç¨ä¸åæ¸æåº«ï¼å¨ç¸åæä¸åçç¶²ç«ä¸ï¼ï¼é£éº¼å°¤å ¶å¦æ¤ãä»åéæä¾äºä¸åæé¡¯çå°æ¹ä¾å·è¡æ¸æé©èåæª¢æ¥ã
å註ï¼ä½¿ç¨ ODM / ORM é常å¯ä»¥éä½éç¼åç¶è·ææ¬ï¼é¤éä½ éå¸¸çææ¬å°æ¥è©¢èªè¨ï¼æè æ§è½å°ä½ è³ééè¦ï¼å¦åä½ æè©²å¼·çèæ ®ä½¿ç¨ ODMã
ææè©²ä½¿ç¨åªå ORM/ODM ?
NPM å¥ä»¶ç®¡çå¨ç«é»ä¸ï¼æè¨±å¤ ODM / ORM è§£æ±ºæ¹æ¡ï¼æ¥ç odm å orm æ¨ç±¤çåéåï¼ï¼ã
卿°å¯«æ¬ææï¼åæ¡è¿çå¹¾ç¨®è§£æ±ºæ¹æ¡æ¯ï¼
- Mongoose: Mongoose æ¯ä¸å MongoDBå°è±¡å»ºæ¨¡å·¥å ·ï¼ç¨æ¼å¨ç°æ¥ç°å¢ä¸å·¥ä½ã
- Waterline: 宿¯å¾åºæ¼ Express ç Sails web æ¡æ¶ä¸æåç ORMã宿ä¾äºä¸åçµ±ä¸ç APIï¼ä¾è¨ªåç¾å¤ä¸åçæ¸æåº«ï¼å æ¬ Redisï¼mySQLï¼LDAPï¼MongoDB å Postgresã
- Bookshelf: æä¾åºæ¼ promise åå³çµ±åèª¿çæ¥å£ï¼æä¾äºåæ¯æï¼eager/åµå¥ eager éä¿å è¼ï¼å¤æ éè¯ä»¥åå°ä¸å°ä¸ï¼ä¸å°å¤åå¤å°å¤éä¿çæ¯æãé©ç¨æ¼ PostgreSQLï¼MySQL å SQLite3ã
- Objection: 以ç¡å¯è½ç°¡å®çæ¹å¼ï¼ä½¿ç¨ SQL çå ¨é¨åè½ï¼ååºå±¤æ¸æåº«å¼æï¼æ¯æ SQLite3ï¼Postgres å MySQLï¼ã
- Sequelize æ¯ Node.js å io.js åºæ¼ promise ç ORMã宿¯æä»¥ä¸æ¸æåº«æ¹è¨ï¼PostgreSQLï¼MySQLï¼MariaDBï¼SQLite å MSSQLï¼ä¸¦å ·æå¯é çäºåæ¯æï¼éä¿ï¼å¯è®è¤æ¬çåè½ã
ä¸è¬ä¾èªªï¼å¨é¸æè§£æ±ºæ¹æ¡æï¼ä½ æè©²èæ ®æä¾çåè½å ãç¤¾åæ´»åã ï¼ä¸è¼ï¼è²¢ç»ï¼é¯èª¤å ±åï¼ææªè³ªéçï¼ã卿°å¯«æ¬ææï¼Mongoose æ¯è¿ä»çºæ¢æåæ¡è¿ç ODMï¼å¦æä½ å° MongoDB ç¨æ¼ä½ çæ¸æåº«ï¼é£éº¼å®æ¯ä¸ååçç鏿ã
卿¬å°åæ¸é¤¨ä½¿ç¨ Mongoose å MongoDb
å°æ¼æ¬å°åæ¸é¤¨ç¤ºä¾ï¼ä»¥åæ¬ä¸»é¡çå ¶é¤é¨åï¼ï¼æåå°ä½¿ç¨ Mongoose ODM ä¾è¨ªåæåçåæ¸é¤¨æ¸æã Mongoose æ¯ MongoDB çå端ï¼MongoDB æ¯ä¸å使ç¨é¢åææªæ¸ææ¨¡åçéæº NoSQL æ¸æåº«ãå¨ MongoDB æ¸æåº«ä¸ï¼ãææªã ç ãéåã ï¼é¡ä¼¼æ¼éä¿æ¸æåº«ä¸ ãè¡ã ç ã表ãã
é種 ODM 忏æåº«ççµåå¨ Node 社åä¸é常æµè¡ï¼é¨ååå æ¯ææªåå²åæ¥è©¢ç³»çµ±ï¼çèµ·ä¾é常å JSONï¼å æ¤å° JavaScript éç¼äººå¡ä¾èªªå¾çæã
å註ï¼ä½¿ç¨ Mongoose æï¼ä½ ä¸éè¦äºå äºè§£ MongoDBï¼ä½æ¯å¦æä½ å·²ç¶çæ MongoDBï¼Mongoose documentationææªçä¸é¨åææ´ææ¼ä½¿ç¨åçè§£ã
æ¬æç¨çå ¶é¤é¨åï¼å°ä»ç´¹å¦ä½çº æ¬å°åæ¸é¤¨ç¶²ç«ç¤ºä¾ï¼å®ç¾©å訪å Mongoose 模å¼å模åã
è¨è¨æ¬å°åæ¸é¤¨ç模å
å¨ä½ éå§ç·¨å¯«æ¨¡åä¹åï¼è±å¹¾åéçæéæèï¼æåéè¦å²åçæ¸æä»¥åä¸åå°è±¡ä¹éçéä¿ã
æåç¥éï¼æåéè¦å²åæéæ¸ç±çè¨æ¯ï¼æ¨é¡ï¼æè¦ï¼ä½è ï¼ç¨®é¡ï¼åéæ¨æºæ¸èï¼ï¼ä»¥åæåå¯è½æå¤å坿¬å¯ç¨ï¼å ·æå ¨åå¯ä¸ IDï¼å¯ç¨çæ çï¼ãæåå¯è½éè¦å岿éä½è çæ´å¤è¨æ¯ï¼èä¸å å æ¯ä»åçååï¼ä¸¦ä¸å¯è½æå¤åä½è ï¼å ·æç¸åæç¸ä¼¼çå稱ãæå叿è½å¤ æ ¹ææ¸åï¼ä½è ï¼ç¨®é¡åé¡å¥å°è¨æ¯é²è¡åé¡ã
å¨è¨è¨æ¨¡åæï¼å°æ¼æ¯åãå°è±¡ãï¼ç¸éè¨æ¯çµï¼é½æç¨ç«ç模åï¼æ¯ææç¾©çãå¨éç¨®æ æ³ä¸ï¼æé¡¯çå°åæ¯æ¸ç±ï¼æ¸ç±å¯¦ä¾åä½è ã
ä½ å¯è½é叿ï¼ä½¿ç¨æ¨¡åä¾è¡¨ç¤ºé¸æå表é¸é ï¼ä¾å¦ï¼é¸æç䏿å表ï¼ï¼è䏿¯å°é¸é 硬編碼å°ç¶²ç«æ¬èº«â å¨ç¡æ³é å ç¥éææé¸é ï¼æè å¯è½æ´æ¹æï¼æ´å»ºè°ä½¿ç¨æ¨¡åä¾è¡¨ç¤ºã徿顝çï¼æ¸æ¬é¡åæ¯é種模åçå¯è½äººé¸ï¼ä¾å¦ç§å¹»å°èªªï¼æ³åè©©æçï¼ã
䏿¦æå決å®äºæåçæ¨¡åååæ®µï¼æåå°±éè¦èæ ®å®åä¹éçéä¿ã
èæ
®å°éä¸é»ï¼ä¸é¢ç UML éè¯åï¼é¡¯ç¤ºäºæåå¨é種æ
æ³ä¸å®ç¾©ç模åï¼ä¸åæ¡å°æä¸å模åï¼ãå¦ä¸æè¿°ï¼æååµå»ºäºä»¥ä¸æ¨¡åï¼åæ¸ï¼æ¬æ¸çéç¨ç´°ç¯ï¼ï¼æ¸æ¬å¯¦ä¾ï¼ç³»çµ±ä¸å¯ç¨åæ¸çç¹å®å¯¦é坿¬ççæ
ï¼åä½è
ãæåéæ±ºå®å»ºç«ä¸åç¨®é¡æ¨¡åï¼ä»¥ä¾¿å¯ä»¥åæ
åµå»ºå®çå¼ï¼è䏿¯å°ä¸æé¸é
硬編碼ãæåå·²ç¶æ±ºå®ä¸çºæ¸æ¬å¯¦ä¾ï¼çæ
BookInstance:statuså»ºç«æ¨¡åâæåå°ç¡¬ç·¨ç¢¼å¯æ¥åçå¼ï¼å çºæåä¸å¸æéäºå¼ç¼çè®åãå¨ä¸åæ¯åæ¡ä¸ï¼ä½ å¯ä»¥çå°æ¨¡åå稱ï¼å段å稱åé¡åï¼ä»¥åæ¹æ³åå
¶è¿åé¡åã
ä¸åéé¡¯ç¤ºäºæ¨¡åä¹éçéä¿ï¼å
æ¬å®åçå¤éæ§ãå¤éæ§æ¯åä¸é¡¯ç¤ºå¯è½å卿¼éä¿ä¸çæ¯å模åçæ¸éï¼æå¤§å¼åæå°å¼ï¼çæ¸åãä¾å¦ï¼æ¡ä¹éç飿¥ç·ï¼é¡¯ç¤ºæ¸æ¬Bookå種é¡Genreæ¯ç¸éçãé è¿æ¸æ¬Book模åçæ¸åï¼è¡¨æä¸æ¬æ¸å¿
é æé¶åæå¤å種é¡ï¼ä½ æ³è¦å¤å°é½å¯ä»¥ï¼ï¼è種é¡Genreæéä¸è¡çæ¸åï¼è¡¨æå®å¯ä»¥æé¶åæå¤åç¸éæ¸ç±ã
åè¨»ï¼æ£å¦æåå¨ä¸é¢çMongoose å
¥é䏿è¨è«ç飿¨£ï¼é常åªéè¦å¨ä¸å模åä¸å®ç¾©ææª/模åä¹ééä¿çåæ®µï¼ééå¨å¦ä¸å模åä¸æç´¢ç¸éç_idä»ç¶å¯ä»¥æ¾å°ååéä¿ï¼ãä¸é¢æå鏿卿¸æ¬ç¶±è¦ï¼Book schemaï¼ä¸å®ç¾© Book/Genre å Book/Author ä¹éçéä¿ï¼ä»¥åæ¸æ¬å¯¦ä¾ç¶±è¦ï¼BookInstance Schemaï¼ä¸ Book/BookInstance ä¹éçéä¿ãéç¨®é¸ææé»æ¦æ·âæå忍£å¯ä»¥å¨å
¶ä»ç¶±è¦ä¸ææè©²å段ã

å註ï¼ä¸ä¸ç¯æä¾äºä¸ååºæ¬çå ¥éç¥èï¼è§£éå¦ä½å®ç¾©åä½¿ç¨æ¨¡åãå¨ä½ é±è®å®æï¼è«æ³æ³æåå°å¦ä½æ§å»ºä¸åä¸çæ¯å模åã
Mongoose å ¥é
æ¬ç¯æ¦è¿°å¦ä½å° Mongoose 飿¥å° MongoDB æ¸æåº«ï¼å¦ä½å®ç¾©æ¨¡åç¶±è¦å模åï¼ä»¥åå¦ä½é²è¡åºæ¬æ¥è©¢ã
åè¨»ï¼æ¬å ¥éåå° npm ä¸çMongoose å¿«éå ¥éåMongoose 宿¹ææªçãæ·±åº¦å½±é¿ãã
å®è£ Mongoose å MongoDB
Mongoose åä»»ä½å ¶ä»ä¾è³´é 䏿¨£ï¼å®è£å¨ä½ çé ç®ï¼package.jsonï¼ä¸âä½¿ç¨ NPMãè¦å®è£å®ï¼è«å¨é ç®æä»¶å¤¾ä¸ï¼ä½¿ç¨ä»¥ä¸å½ä»¤ï¼
npm install mongoose
å®è£ Mongoose ææ·»å ææä¾è³´é ï¼å æ¬ MongoDB æ¸æåº«é© åç¨åºï¼ä½å®ä¸æå®è£ MongoDB ãå¦æä½ æ³å®è£ä¸å MongoDB æåå¨ï¼é£éº¼ä½ å¯ä»¥å¾é裡ä¸è¼å種æä½ç³»çµ±çå®è£ç¨åºï¼ä¸¦å¨æ¬å°å®è£ãä½ éå¯ä»¥ä½¿ç¨åºæ¼é²ç«¯ç MongoDB 實ä¾ã
å註ï¼å°æ¼æ¬æç¨ï¼æåå°ä½¿ç¨åºæ¼ mLab é²çæ¸æåº«ï¼ä½çºæåæ²ç®±å±¤ä¾æä¾æ¸æåº«ãéé©ç¨æ¼éç¼ï¼ä¹å°æ¼æ¬æç¨å¾ææç¾©ï¼å çºå®ä½¿ãå®è£ãèæä½ç³»çµ±ç¡éï¼æ¸æåº«å³æåï¼ä¹æ¯ä½ å¯è½æç¨æ¼çç¢ç°å¢æ¸æåº«çä¸ç¨®æ¹æ³ï¼ã
飿¥å° MongoDB
Mongoose éè¦é£æ¥å° MongoDB æ¸æåº«ãä½ å¯ä»¥require()並使ç¨mongoose.connect()ï¼ä»¥é£æ¥å°æ¬å°è¨ç®¡çæ¸æåº«ï¼å¦ä¸æç¤ºã
//Import the mongoose module
var mongoose = require("mongoose");
//Set up default mongoose connection
var mongoDB = "mongodb://127.0.0.1/my_database";
mongoose.connect(mongoDB);
// Get Mongoose to use the global promise library
mongoose.Promise = global.Promise;
//Get the default connection
var db = mongoose.connection;
//Bind connection to error event (to get notification of connection errors)
db.on("error", console.error.bind(console, "MongoDB connection error:"));
ä½ å¯ä»¥ä½¿ç¨mongoose.connectionç²åé»èªçConnectionå°è±¡ã䏿¦é£æ¥ï¼å¨Connection實ä¾ä¸ï¼å°è§¸ç¼æéäºä»¶ã
å註ï¼å¦æéè¦åµå»ºå
¶ä»é£æ¥ï¼å¯ä»¥ä½¿ç¨mongoose.createConnection()ãéèconnect()æ¡ç¨ç¸åå½¢å¼çæ¸æåº« URIï¼å
å«ä¸»æ©ï¼æ¸æåº«ï¼ç«¯å£ï¼é¸é
çï¼ï¼ä¸¦è¿åConnectionå°è±¡ã
å®ç¾©ä¸¦åµå»ºæ¨¡å
模å使ç¨Schemaæ¥å£é²è¡å®ç¾©ãSchema å
è¨±ä½ å®ç¾©åå²å¨æ¯åææªä¸çåæ®µï¼åå
¶é©èè¦æ±åé»èªå¼ãæ¤å¤ï¼ä½ å¯ä»¥å®ç¾©éæ
å實ä¾å©ææ¹æ³ï¼ä»¥æ´è¼é¬å°èçæ¸æé¡åï¼ä»¥åå¯ä»¥åå
¶ä»ä»»ä½åæ®µä¸æ¨£ä½¿ç¨çèæ¬å±¬æ§ï¼ä½å¯¦éä¸ä¸¦ä¸åå²å¨æ¸æåº«ä¸ï¼æåç¨å¾å°è¨è«ï¼ã
ç¶å¾ï¼ç¶±è¦ Schemas 被mongoose.model()æ¹æ³ãç·¨è¯ãçºæ¨¡åãæææ¨¡åå¾ï¼ä½ å¯ä»¥ä½¿ç¨å®ä¾æ¥æ¾ï¼åµå»ºï¼æ´æ°ååªé¤çµ¦å®é¡åçå°è±¡ã
åè¨»ï¼æ¯å模å齿 å°å° MongoDB æ¸æåº«ä¸çææªéåãéäºææªå°å
嫿¨¡åç¶±è¦Schemaä¸å®ç¾©çåæ®µ/ç¶±è¦åæ
ã
å®ç¾©ç¶±è¦ Schemas
ä¸é¢çä»£ç¢¼çæ®µï¼é¡¯ç¤ºäºä½ å¯ä»¥å¦ä½å®ç¾©ä¸åç°¡å®çç¶±è¦ãé¦å
require()mongooseï¼ç¶å¾ä½¿ç¨ Schema æ§é 彿¸ï¼åµå»ºä¸åæ°ç Schema 實ä¾ï¼å¨æ§é 彿¸çå°è±¡åæ¸ä¸ï¼å®ç¾©å
¶ä¸çåååæ®µã
//Require Mongoose
var mongoose = require("mongoose");
//Define a schema
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
å¨ä¸é¢çä¾åä¸ï¼æååªæå ©ååæ®µï¼ä¸åå符串åä¸åæ¥æã卿¥ä¸ä¾çé¨åä¸ï¼æåå°å±ç¤ºä¸äºå ¶ä»çåæ®µé¡åï¼é©èåå ¶ä»æ¹æ³ã
åµå»ºæ¨¡å
使ç¨mongoose.model()æ¹æ³å¾ç¶±è¦åµå»ºæ¨¡åï¼
// Define schema
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
// Compile model from schema
var SomeModel = mongoose.model("SomeModel", SomeModelSchema);
第ä¸ååæ¸ï¼æ¯å°çºæ¨¡ååµå»ºçéåç宿¸å稱ï¼Mongoose å°çºä¸é¢ç SomeModel 模åï¼åµå»ºæ¸æåº«éåï¼ï¼ç¬¬äºååæ¸ï¼æ¯ä½ è¦å¨åµå»ºæ¨¡åæä½¿ç¨çç¶±è¦ Shemaã
å註ï¼å®ç¾©æ¨¡åé¡å¾ï¼å¯ä»¥ä½¿ç¨å®åä¾åµå»ºï¼æ´æ°æåªé¤è¨éï¼ä¸¦éè¡æ¥è©¢ï¼ä»¥ç²åè¨éçææè¨éï¼æç¹å®åéãæåå°å¨ä»¥ä¸ãä½¿ç¨æ¨¡åãé¨åï¼åä½ å±ç¤ºå¦ä½å·è¡ä¸è¿°æä½ï¼ä»¥åç¶åµå»ºè¦åæï¼å¦ä½å·è¡æ¤æä½ã
ç¶±è¦åæ ï¼å段ï¼
ç¶±è¦ schema å¯ä»¥æä»»ææ¸éçåæ®µ â æ¯ååæ®µä»£è¡¨åå²å¨ MongoDB ææªä¸çåæ®µãå¦ä¸ç示ä¾ç¶±è¦ï¼é¡¯ç¤ºè¨±å¤å¸¸è¦å段é¡ååå ¶è²ææ¹å¼ã
var schema = new Schema({
name: String,
binary: Buffer,
living: Boolean,
updated: { type: Date, default: Date.now },
age: { type: Number, min: 18, max: 65, required: true },
mixed: Schema.Types.Mixed,
_someId: Schema.Types.ObjectId,
array: [],
ofString: [String], // You can also have an array of each of the other types too.
nested: { stuff: { type: String, lowercase: true, trim: true } },
});
大夿¸ç¶±è¦åæ SchemaTypesï¼ãtypeï¼ãä¹å¾æå段å稱ä¹å¾çæè¿°ç¬¦ï¼é½æ¯èªè§£éçãä¾å¤æ æ³æ¯ï¼
ObjectId:è¡¨ç¤ºæ¸æåº«ä¸æ¨¡åçç¹å®å¯¦ä¾ãä¾å¦ï¼ä¸æ¬æ¸å¯è½æä½¿ç¨å®ä¾è¡¨ç¤ºå ¶ä½è å°è±¡ãé實éä¸å°å 嫿å®å°è±¡çå¯ä¸ ID (_id) ãæåå¯ä»¥ä½¿ç¨populate()æ¹æ³ï¼å¨éè¦ææåç¸éè¨æ¯ã- Mixed :ä»»æç¶±è¦åæ ã
- []ï¼ä¸åæ¸çµçé ç®ãä½ å¯ä»¥å¨éäºæ¨¡åä¸å·è¡ JavaScript æ¸çµæä½ï¼pushãpopãunshift çï¼ãä¸é¢çä¾åï¼é¡¯ç¤ºäºä¸åæ²ææå®é¡åçå°åæ¸çµï¼åä¸å String å°åæ¸çµï¼ä½æ¯ä½ å¯ä»¥æä»»ä½é¡åçå°åæ¸çµã
該代碼é顯示äºè²æä¸ååæ®µçå ©ç¨®æ¹å¼ï¼
- åæ®µå稱åé¡åä½çºéµå¼å°ï¼å³æ¯ï¼åä¸é¢ç
name,binaryandlivingï¼ã - åæ®µå稱å¾è·ä¸åå®ç¾©é¡å
typeçå°è±¡ï¼ä»¥åè©²åæ®µçä»»ä½å ¶ä»é¸é ãé¸é å æ¬å¦ä¸å §å®¹ï¼- é»èªå¼ã
- å §ç½®é©èå¨ï¼ä¾å¦æå¤§/æå°å¼ï¼åèªå®ç¾©é©èåè½ã
- è©²åæ®µæ¯å¦çºå¿ è¦
- æ¯å¦æå°å符串
Stringåæ®µèªåè¨ç½®çºå°å¯«ï¼å¤§å¯«æä¿®åªï¼ä¾å¦){ type:String, lowercase: true, trim: true }
æéé¸é çæ´å¤è¨æ¯ï¼è«åé±SchemaTypesï¼Mongoose docsï¼ã
é©è
Mongoose æä¾å §ç½®åèªå®ç¾©é©èå¨ï¼ä»¥å忥åç°æ¥é©èå¨ãå®å è¨±ä½ å¨æææ æ³ä¸ï¼æå®å¯æ¥åçç¯åæå¼ï¼ä»¥åé©è失æçé¯èª¤æ¶æ¯ã
å §ç½®çé©èå¨å æ¬ï¼
- ææSchemaTypesé½å ·æå §ç½®çå¿ éé©èå¨ãéç¨æ¼æå®ï¼æ¯å¦å¿ é æä¾è©²å段æè½ä¿åææªã
- Numbers æ¸åææå°minåæå¤§maxé©èå¨ã
- Stringså符串æï¼
ä¸é¢ç示ä¾ï¼å¾ Mongoose ææªç¨å¾®ä¿®æ¹ï¼é¡¯ç¤ºçå¦ä½æå®ä¸äºé©èå¨é¡ååé¯èª¤æ¶æ¯ï¼
var breakfastSchema = new Schema({
eggs: {
type: Number,
min: [6, 'Too few eggs'],
max: 12
required: [true, 'Why no eggs?']
},
drink: {
type: String,
enum: ['Coffee', 'Tea', 'Water',]
}
});
æéåæ®µé©èç宿´è¨æ¯ï¼è«åé±é©èï¼Mongoose docsï¼ã
èæ¬å±¬æ§
èæ¬å±¬æ§æ¯ä½ å¯ä»¥ç²ååè¨ç½®çææªå±¬æ§ï¼ä½ä¸ææä¹ ä¿åå° MongoDBãgetter å°æ ¼å¼åæçµååæ®µé常æç¨ï¼è setter å¯ç¨æ¼å°å®åå¼åè§£çºå¤åå¼ï¼ä»¥é²è¡åå²ã
ææªä¸ç示ä¾ï¼å¾åååå§æ°å段æ§é ï¼ä¸¦è§£æ§ï¼ä¸åå ¨åèæ¬å±¬æ§ï¼éæ¯æ¯æ¬¡å¨æ¨¡æ¿ä¸ä½¿ç¨å ¨åæ´ç°¡å®ï¼æ´æ¸ æ°ã
åè¨»ï¼æåå°ä½¿ç¨åº«ä¸çèæ¬å±¬æ§ï¼ä¾çºæ¯å使ç¨è·¯å¾åè¨éç_idå¼ç模åè¨éï¼å®ç¾©å¯ä¸ç URLã
欲äºè§£æ´å¤è¨æ¯ï¼è«åé±èæ¬ï¼Mongoose ææªï¼ã
æ¹æ³åæ¥è©¢å¹«å©
ç¶±è¦ schema ä¹å¯ä»¥æå¯¦ä¾æ¹æ³ï¼éæ
æ¹æ³åæ¥è©¢å©æã實ä¾åéæ
æ¹æ³å¾ç¸ä¼¼ï¼ä½ææé¡¯çåå¥ï¼å³å¯¦ä¾æ¹æ³èç¹å®è¨éç¸éè¯ï¼ä¸¦ä¸å¯ä»¥è¨ªåç¶åå°è±¡ãæ¥è©¢å©æå
è¨±ä½ æ´å± mongoose çé弿¥è©¢æ§å»ºå¨ APIï¼ä¾å¦ï¼é¤äºfind(), findOne()åfindById()æ¹æ³å¤ï¼éå
è¨±ä½ æ·»å ä¸åãbyNameãæ¥è©¢ã
ä½¿ç¨æ¨¡å
䏿¦åµå»ºäºç¶±è¦ï¼å°±å¯ä»¥ä½¿ç¨å®ä¾åµå»ºæ¨¡åã該模åä»£è¡¨æ¸æåº«ä¸å¯ä»¥æç´¢çææªéåï¼è模åç實ä¾ä»£è¡¨ä½ å¯ä»¥ä¿ååæª¢ç´¢çå®åææªã
æåå¨ä¸é¢ç°¡è¦ä»ç´¹ä¸ä¸ãæéæ´å¤è¨æ¯ï¼è«åé±ï¼æ¨¡åï¼Mongoose docsï¼ã
åµå»ºåä¿®æ¹ææª
è¦åµå»ºè¨éï¼ä½ å¯ä»¥å®ç¾©æ¨¡åç實ä¾ï¼ç¶å¾èª¿ç¨save()ãä¸é¢çä¾ååè¨ï¼SomeModel æ¯æåå¾ç¶±è¦åµå»ºç模åï¼å¸¶æå®ä¸å段ãnameã ï¼ã
// Create an instance of model SomeModel
var awesome_instance = new SomeModel({ name: "awesome" });
// Save the new model instance, passing a callback
awesome_instance.save(function (err) {
if (err) return handleError(err);
// saved!
});
åµå»ºè¨éï¼ä»¥åæ´æ°ï¼åªé¤åæ¥è©¢ï¼æ¯ç°æ¥æä½â ä½ æä¾å¨æä½å®ææèª¿ç¨çå調ãAPI 使ç¨é¯èª¤åªå 忏ç´å®ï¼å æ¤å調ç第ä¸å忏å°å§çµçºé¯èª¤å¼ï¼æ nullï¼ã妿 API è¿åä¸äºçµæï¼åå°ä½çºç¬¬äºå忏æä¾ã
ä½ éå¯ä»¥ä½¿ç¨create()ï¼åæå®ç¾©æ¨¡å實ä¾ï¼ä¸¦ä¿å模å實ä¾ãå調å°çºç¬¬ä¸å忏è¿åé¯èª¤ï¼çºç¬¬äºå忏è¿åæ°åµå»ºç模å實ä¾ã
SomeModel.create({ name: "also_awesome" }, function (err, awesome_instance) {
if (err) return handleError(err);
// saved!
});
æ¯å模å齿ä¸åéè¯ç飿¥ï¼ç¶ä½ 使ç¨mongoose.model()æï¼éå°æçºé»èªé£æ¥ï¼ãä½ åµå»ºä¸åæ°é£æ¥ä¸¦èª¿ç¨.model()ï¼ä»¥å¨å¦ä¸åæ¸æåº«ä¸åµå»ºææªã
ä½ å¯ä»¥ä½¿ç¨é»èªæ³è¨ªåæ¤æ°è¨éä¸çåæ®µï¼ä¸¦æ´æ¹å¼ãä½ å¿
é 調ç¨save()æupdate()ï¼å°ä¿®æ¹çå¼å忏æåº«ã
// Access model field values using dot notation
console.log(awesome_instance.name); //should log 'also_awesome'
// Change record by modifying the fields, then calling save().
awesome_instance.name = "New cool name";
awesome_instance.save(function (err) {
if (err) return handleError(err); // saved!
});
å°æ¾ç´é
å¯ä»¥ä½¿ç¨æ¥è©¢æ¹æ³æç´¢è¨éï¼å°æ¥è©¢æ¢ä»¶æå®çº JSON ææªãä¸é¢çä»£ç¢¼çæ®µï¼é¡¯ç¤ºçå¦ä½å¨æ¸æåº«ä¸ï¼æ¾å°ææåå ç¶²çéåçéåå¡ï¼åªè¿åéåå¡å§åå年齡çåæ®µãé裡æååªæå®ä¸åå¹é çåæ®µï¼éå sportï¼ï¼ä½ä½ å¯ä»¥æ·»å æ´å¤æ¢ä»¶ï¼æå®æ£å表é弿¨æºï¼æå®å ¨åªé¤æ¢ä»¶ä»¥è¿åææéåå¡ã
var Athlete = mongoose.model("Athlete", yourSchema);
// find all athletes who play tennis, selecting the 'name' and 'age' fields
Athlete.find({ sport: "Tennis" }, "name age", function (err, athletes) {
if (err) return handleError(err);
// 'athletes' contains the list of athletes that match the criteria.
});
å¦æä½ æå®å調ï¼å¦ä¸æç¤ºï¼æ¥è©¢å°ç«å³å·è¡ãæç´¢å®æå¾å°èª¿ç¨å調ã
å註ï¼Mongoose ä¸çææå調ï¼é½ä½¿ç¨æ¤å調模å¼callback(error, result)ã妿å·è¡æ¥è©¢æç¼çé¯èª¤ï¼é¯èª¤åæ¸errorå°å
å«é¯èª¤ææªï¼ä¸¦ä¸çµæresultå°çº nullã妿æ¥è©¢æåï¼åerror忏å°çº nullï¼ä¸¦ä¸çµæresult å°è¢«å¡«å
å°æ¥è©¢çµæã
å¦æä½ æªæå®å調ï¼å API å°è¿åQueryé¡åçè®éãä½ å¯ä»¥ä½¿ç¨æ¤æ¥è©¢å°è±¡ä¾æ§å»ºæ¥è©¢ï¼ç¶å¾ç¨å¾ä½¿ç¨exec()æ¹æ³å·è¡ï¼ä½¿ç¨å調ï¼ã
// find all athletes that play tennis
var query = Athlete.find({ sport: "Tennis" });
// selecting the 'name' and 'age' fields
query.select("name age");
// limit our results to 5 items
query.limit(5);
// sort by age
query.sort({ age: -1 });
// execute the query at a later time
query.exec(function (err, athletes) {
if (err) return handleError(err);
// athletes contains an ordered list of 5 athletes who play Tennis
});
ä¸é¢æåå¨find()æ¹æ³ä¸ï¼å®ç¾©äºæ¥è©¢æ¢ä»¶ãæåä¹å¯ä»¥ä½¿ç¨where()彿¸ä¾å·è¡æ¤æä½ï¼ä¸¦ä¸æåå¯ä»¥ä½¿ç¨é»éç®ç¬¦ï¼ . ï¼å°æ¥è©¢çææé¨å鿥å¨ä¸èµ·ï¼è䏿¯å奿·»å å®åã
ä¸é¢çä»£ç¢¼çæ®µï¼èæåä¸é¢çæ¥è©¢ç¸åï¼ä¸¦æå¹´é½¡çéå æ¢ä»¶ã
Athlete.
find().
where('sport').equals('Tennis').
where('age').gt(17).lt(50). //Additional where query
limit(5).
sort({ age: -1 }).
select('name age').
exec(callback); // where callback is the name of our callback function.
find() æ¹æ³ç²åææå¹é çè¨éï¼ä½éå¸¸ä½ åªæ³ç²å¾ä¸åå¹é ã以䏿¹æ³å¯ä»¥æ¥è©¢å®åè¨éï¼
findById():ç¨æå®çidæ¥æ¾ææªï¼æ¯åææªé½æä¸åå¯ä¸çidï¼ãfindOne(): æ¥æ¾èæå®æ¢ä»¶å¹é çå®åææªãfindByIdAndRemove(),findByIdAndUpdate(),findOneAndRemove(),findOneAndUpdate():ééidææ¢ä»¶æ¥æ¾å®åææªï¼ä¸¦æ´æ°æåªé¤å®ãéäºæ¯ç¨æ¼æ´æ°ååªé¤è¨éçæç¨ä¾¿å©åè½ã
å註ï¼éæä¸åcount()æ¹æ³ï¼ä½ å¯ä»¥ä½¿ç¨å®ä¾ç²åèæ¢ä»¶å¹é
çé
ç®æ¸ãå¦æä½ æ³è¦å¨ä¸å¯¦éæåè¨éçæ
æ³ä¸å·è¡è¨æ¸ï¼éé常æç¨ã
æ¥è©¢å¯ä»¥åæ´å¤çäºæ ãæéæ´å¤è¨æ¯ï¼è«åé±ï¼æ¥è©¢ï¼Mongoose ææªï¼ã
éç¨ç¸éææªâ population æ¹æ³
ä½ å¯ä»¥ä½¿ç¨ObjectIdç¶±è¦å段ï¼å¾ä¸åææª/模å實ä¾ï¼åµå»ºä¸å°ä¸å¼ç¨ï¼æè
使ç¨ObjectIdsæ¸çµï¼å¾ä¸åææªåµå»ºä¸å°å¤çå¼ç¨ãè©²åæ®µåå²ç¸é模åç IDã妿éè¦éè¯ææªç實éå
§å®¹ï¼å¯ä»¥å¨æ¥è©¢ä¸ä½¿ç¨populate()æ¹æ³ï¼å° id æ¿æçºå¯¦éæ¸æã
ä¾å¦ï¼ä»¥ä¸ç¶±è¦å®ç¾©ä½è
åæ
äºãæ¯åä½è
å¯ä»¥æå¤åæ
äºï¼æåå°å
¶è¡¨ç¤ºçºä¸åObjectIdæ¸çµãæ¯åæ
äºå¯ä»¥æä¸åä½è
ãç¶±è¦å¾ãrefãï¼ä»¥ç²é«çªåºé¡¯ç¤ºï¼å¾ç¥ï¼å¯ä»¥åé
çµ¦è©²åæ®µç模åã
var mongoose = require("mongoose"),
Schema = mongoose.Schema;
var authorSchema = Schema({
name: String,
stories: [{ type: Schema.Types.ObjectId, ref: "Story" }],
});
var storySchema = Schema({
author: { type: Schema.Types.ObjectId, ref: "Author" },
title: String,
});
var Story = mongoose.model("Story", storySchema);
var Author = mongoose.model("Author", authorSchema);
æåå¯ä»¥ééåé
_idå¼ï¼ä¾ä¿åå°ç¸éææªçå¼ç¨ãä¸é¢æååµå»ºä¸åä½è
ï¼ç¶å¾åµå»ºä¸åæ
äºï¼ä¸¦å°ä½è
ID åé
給æåçæ
äºä½è
åæ®µã
var bob = new Author({ name: "Bob Smith" });
bob.save(function (err) {
if (err) return handleError(err);
//Bob now exists, so lets create a story
var story = new Story({
title: "Bob goes sledding",
author: bob._id, // assign the _id from the our author Bob. This ID is created by default!
});
story.save(function (err) {
if (err) return handleError(err);
// Bob now has his story
});
});
æåçæ
äºææªï¼ç¾å¨æä½è
ææª ID å¼ç¨çä½è
ãçºäºå¨æåçæ
äºçµæä¸ï¼ç²åä½è
è¨æ¯ï¼æå使ç¨populate()ï¼å¦ä¸æç¤ºã
Story.findOne({ title: "Bob goes sledding" })
.populate("author") //This populates the author id with actual author information!
.exec(function (err, story) {
if (err) return handleError(err);
console.log("The author is %s", story.author.name);
// prints "The author is Bob Smith"
});
åè¨»ï¼æé³çè®è
ææ³¨æå°ï¼æå卿
äºä¸æ·»å äºä½è
ï¼ä½æåæ²æåä»»ä½äºæ
ï¼ä¾å°æåçæ
äºæ·»å å°ä½è
çæ
äºstoriesæ¸çµä¸ãé£éº¼æåææ¨£æè½å¾å°ç¹å®ä½è
çæææ
äºï¼
ä¸ç¨®æ¹æ³ï¼æ¯å°ä½è
æ·»å å°æ
äºæ¸çµä¸ï¼ä½éæå°è´æåéè¦å¨å
©åå°æ¹ï¼ç¶è·èä½è
åæ
äºæéçè¨æ¯ãæ´å¥½çæ¹æ³æ¯ç²åä½è
ç_idï¼ç¶å¾ä½¿ç¨find()ï¼å¨æææ
äºçä½è
åæ®µä¸æç´¢æ¤å
§å®¹ã
Story.find({ author: bob._id }).exec(function (err, stories) {
if (err) return handleError(err);
// returns all stories that have Bob's id as their author.
});
é幾乿¯ä½ 卿¬æç¨ä¸ï¼ä½¿ç¨ç¸éé ç®æï¼éè¦äºè§£çææå §å®¹ãæéæ´å¤è©³ç´°è¨æ¯ï¼è«åé±Populationï¼Mongoose docsï¼ã
ä¸åæªæ¡å°æä¸åç¶±è¦/模å
éç¶ä½ å¯ä»¥ä½¿ç¨ä»»ä½åæ¡çæä»¶çµæ§åµå»ºç¶±è¦å模åï¼ä½æåå¼·ç建è°å¨æ¯åæ¨¡åæ¨¡å¡ï¼æä»¶ï¼ä¸ï¼å®ç¾©æ¯å模åç¶±è¦ï¼å°åºæ¹æ³ä»¥åµå»ºæ¨¡åãå¦ä¸æç¤ºï¼
// File: ./models/somemodel.js
//Require Mongoose
var mongoose = require("mongoose");
//Define a schema
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
//Export function to create "SomeModel" model class
module.exports = mongoose.model("SomeModel", SomeModelSchema);
ç¶å¾ï¼ä½ å¯ä»¥å¨å ¶ä»æä»¶ä¸ï¼ç«å³è¦æ±ä¸¦ä½¿ç¨è©²æ¨¡åãä¸é¢æåå±ç¤ºå¦ä½ä½¿ç¨å®ï¼ä¾ç²å模åçææå¯¦ä¾ã
//Create a SomeModel model just by requiring the module
var SomeModel = require("../models/somemodel");
// Use the SomeModel object (model) to find all SomeModel records
SomeModel.find(callback_function);
æ¶è¨ MongoDB æ¸æåº«
ç¾å¨æåäºè§£äº Mongoose è½åä»éº¼ï¼ä»¥åæåæ³å¦ä½è¨è¨æåçæ¨¡åï¼ç¾å¨è©²éå§å¨ LocalLibrary ç¶²ç«ä¸å·¥ä½äºãæåæ³è¦åç第ä¸ä»¶äºï¼å°±æ¯è¨ç½®ä¸å MongoDb æ¸æåº«ï¼æåå¯ä»¥ä½¿ç¨å®ä¾å²åæåçåæ¸é¤¨æ¸æã
æ¬æç¨ï¼æåå°ä½¿ç¨mLabå è²»çé²è¨ç®¡çã æ²ç ãæ¸æåº«ãé忏æåº«å±¤ä¸é©åçç¢ç°å¢çç¶²ç«ï¼å çºå®æ²æåé¤è¨è¨ï¼ä½å®å°æ¼éç¼åååè¨è¨ä¾èªªé常æç¨ãæåå¨é裡使ç¨å®ï¼æ¯å çºå®å è²»ä¸ææ¼è¨ç½®ï¼ä¸¦ä¸å çºä½çºæ¸æåº«æå便åä¾èªªï¼mLab æ¯æµè¡çæ¸æåº«é¸æä¹ä¸ï¼ä½ å¯è½æåçé¸æä½ ççç¢ç°å¢æ¸æåº«ï¼æ°å¯«æ¬ææï¼å ¶ä»æµè¡çé¸æå æ¬ComposeãScaleGridåMongoDB Atlasï¼ã
å註ï¼å¦æä½ 顿ï¼å¯ä»¥ä¸è¼ä¸¦å®è£è系統ç¸å°æçäºé²è£½æä»¶ï¼å¨æ¬å°è¨ç½® MongoDb æ¸æåº«ãé¤äºä½ å¨é£æ¥ææå®çæ¸æåº« URL ä¹å¤ï¼æ¬æä¸çå ¶é¤æä»¤å°å¾é¡ä¼¼ã
ä½ é¦å éè¦ä½¿ç¨ mLab åµå»ºä¸å賬æ¶ï¼éæ¯å è²»çï¼åªéè¦è¼¸å ¥åºæ¬è¯ç¹«è¨æ¯ï¼ä¸¦ç¢ºèªå ¶æåæ¢æ¬¾ï¼ã
ç»éå¾ï¼ä½ å°é²å ¥mLab 主ç«é¢:
-
宿 MongoDB Deployments é¨åä¸ç Create Newã

-
éå°æéã鲿ä¾åãCloud Provider 鏿ç«é¢ã

- å¾ãè¨åé¡åãPlan Type é¨åä¸ï¼é¸æãSANDBOXï¼å è²»ï¼ãè¨åã
- å¾ã鲿ä¾åãCloud Provider é¨åï¼é¸æä»»ææä¾åãä¸åçæä¾åï¼æä¾ä¸åçå°åï¼é¡¯ç¤ºå¨é¸å®çè¨åé¡åä¸é¢ï¼ã
- 宿ãç¹¼çºãContinue æéã
-
éå°æéã鏿ååãSelect Region ç«é¢ã

- 鏿é¢ä½ æè¿çå°åï¼ç¶å¾é¸æç¹¼çº Continueã
-
éå°æé Final Details ç«é¢ã

- 輸å
¥æ°æ¸æåº«çå稱
local_libraryï¼ç¶å¾é¸æç¹¼çº Continueã
- 輸å
¥æ°æ¸æåº«çå稱
-
éå°æéè¨å®ç¢ºèªç«é¢ã

- 宿ãæäº¤è¨å®ãSubmit Order 以åµå»ºæ¸æåº«ã
-
ä½ å°è¿åå°ä¸»ç«é¢ã宿åååµå»ºçæ°æ¸æåº«ï¼ä»¥æéå ¶è©³ç´°è¨æ¯ç«é¢ãæ£å¦ä½ æçå°çï¼æ¸æåº«æ²æéåï¼æ¸æï¼ã
ä½ éè¦ç¨ä¾è¨ªåæ¸æåº«ç URLï¼é¡¯ç¤ºå¨ä¸é¢ç表å®ä¸ï¼å¦ä¸åæç¤ºï¼ãçºäºä½¿ç¨å®ï¼ä½ éè¦åµå»ºä¸åå¯ä»¥å¨ URL 䏿å®çæ¸æåº«ç¨æ¶ã -
å®æç¨æ¶Usersé¸é å¡ï¼ä¸¦é¸ææ·»å æ¸æåº«ç¨æ¶æéAdd database userã
-
è¼¸å ¥ç¨æ¶ååå¯ç¢¼ï¼å ©æ¬¡ï¼ï¼ç¶å¾æåµå»ºCreateãä¸è¦é¸æåªè®read-onlyã

ä½ ç¾å¨å·²ç¶åµå»ºäºæ¸æåº«ï¼ä¸¦ä¸æä¸åå¯ä»¥ç¨ä¾è¨ªåå®ç URLï¼å¸¶æç¨æ¶ååå¯ç¢¼ï¼ãéçèµ·ä¾åæ¯é樣çï¼mongodb://your_user_namer:your_password@ds119748.mlab.com:19748/local_library.
å®è£ Mongoose
æéå½ä»¤æç¤ºç¬¦ï¼ä¸¦å°ä½ åµå»ºæ¬å°åæ¸é¤¨éª¨æ¶ç¶²ç«çç®éãè¼¸å ¥ä»¥ä¸å½ä»¤ï¼å®è£ Mongooseï¼åå ¶ä¾è³´é ï¼ï¼ä¸¦å°å ¶æ·»å å°ä½ çpackage.jsonæä»¶ä¸ï¼é¤éä½ å¨é±è®ä¸è¿°Mongoose å ¥éæï¼å·²ç¶é樣åäºã
npm install mongoose
飿¥å° MongoDB
æé**/app.js**ï¼ä½æ¼é
ç®çæ ¹ç®éï¼ï¼ä¸¦å¨å®£å Express æç¨ç¨åºå°è±¡çä½ç½®ï¼å¨var app = express();ä¹å¾ï¼è¤è£½ä»¥ä¸ææ¬ãå°æ¸æåº« url å符串ï¼'insert_your_database_url_here'ï¼æ¿æçºè¡¨ç¤ºä½ èªå·±çæ¸æåº«çä½ç½® URLï¼å³æ¯ä½¿ç¨ä¾èªä¸é¢ mLabçè¨æ¯ï¼ã
//Set up mongoose connection
var mongoose = require("mongoose");
var mongoDB = "insert_your_database_url_here";
mongoose.connect(mongoDB);
mongoose.Promise = global.Promise;
var db = mongoose.connection;
db.on("error", console.error.bind(console, "MongoDB connection error:"));
æ£å¦ä¸é¢çMongoose å ¥é䏿è¨è«çï¼æ¤ä»£ç¢¼åµå»ºäºèæ¸æåº«çé»èªé£æ¥ï¼ä¸¦ç¶å®å°é¯èª¤äºä»¶ï¼ä»¥ä¾¿å°é¯èª¤æå°å°æ§å¶å°ï¼ã
å®ç¾©æ¬å°åæ¸é¤¨ç¶±è¦
å¦ä¸æè¿°ï¼æåå°çºæ¯å模åå®ç¾©ä¸åå®ç¨ç模å¡ãé¦å å¨é ç®æ ¹ç®éï¼/modelsï¼ä¸ï¼çºæåçæ¨¡ååµå»ºä¸åæä»¶å¤¾ï¼ç¶å¾çºæ¯å模ååµå»ºå®ç¨çæä»¶ï¼
/express-locallibrary-tutorial //the project root
/models
author.js
book.js
bookinstance.js
genre.js
ä½è 模å
è¤è£½ä¸é¢é¡¯ç¤ºçAuthorä½è
ç¶±è¦ä»£ç¢¼ï¼ä¸¦å°å
¶ç²è²¼å°**./models/author.js**æä»¶ä¸ã該綱è¦å®ç¾©äºä¸åä½è
ï¼å
·æStringSchemaTypes ç第ä¸åå稱åå®¶æå稱ï¼éæ¯å¿
éçï¼æå¤æ 100 åå符ï¼Dateåæ®µçºåºçåæ»äº¡æ¥æã
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var AuthorSchema = new Schema({
first_name: { type: String, required: true, max: 100 },
family_name: { type: String, required: true, max: 100 },
date_of_birth: { type: Date },
date_of_death: { type: Date },
});
// Virtual for author's full name
AuthorSchema.virtual("name").get(function () {
return this.family_name + ", " + this.first_name;
});
// Virtual for author's URL
AuthorSchema.virtual("url").get(function () {
return "/catalog/author/" + this._id;
});
//Export model
module.exports = mongoose.model("Author", AuthorSchema);
æåéçº AuthorSchemaï¼è²æäºä¸ååçºãurlãçèæ¬å±¬æ§ï¼å®è¿åç²å模åçç¹å®å¯¦ä¾æéççµå° URL â æ¯ç¶æåéè¦ç²åæåç¹å®ä½è ç鿥æï¼æåå°å¨æ¨¡æ¿ä¸ä½¿ç¨è©²å±¬æ§ã
å註ï¼å¨ç¶±è¦ä¸è²ææåç URL æ¯èæ¬çï¼éæ¯ä¸å好主æï¼å çºä¸åé ç®ç URL åªéè¦å¨ä¸åå°æ¹æ´æ¹ãæ¤æï¼ä½¿ç¨æ¤ URL ç鿥å°ä¸èµ·ä½ç¨ï¼å çºæåéæ²æä»»ä½è·¯ç±ï¼å¯ä»¥èçå奿¨¡å實ä¾ç代碼ãæåå°å¨å¾é¢çæç« ä¸ä»ç´¹éäºå §å®¹ï¼
卿¨¡å¡çæå¾ï¼æåå°åºäºæ¨¡åã
æ¸æ¬æ¨¡å
è¤è£½ä¸é¢é¡¯ç¤ºçBookç¶±è¦ä»£ç¢¼ï¼ä¸¦å°å
¶ç²è²¼å°**./models/book.js**æä»¶ä¸ãå
¶ä¸å¤§é¨åèä½è
模åç¸ä¼¼âæåå·²ç¶è²æäºä¸åå
·æå¤ååç¬¦ä¸²åæ®µçç¶±è¦ï¼ä»¥åä¸åèæ¬å±¬æ§ï¼ç¨æ¼ç²åç¹å®æ¸ç±è¨éç URLï¼ä¸¦ä¸æåå·²ç¶å°åºäºæ¨¡åã
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var BookSchema = new Schema({
title: { type: String, required: true },
author: { type: Schema.Types.ObjectId, ref: "Author", required: true },
summary: { type: String, required: true },
isbn: { type: String, required: true },
genre: [{ type: Schema.Types.ObjectId, ref: "Genre" }],
});
// Virtual for book's URL
BookSchema.virtual("url").get(function () {
return "/catalog/book/" + this._id;
});
//Export model
module.exports = mongoose.model("Book", BookSchema);
é裡ç主è¦åå¥ï¼æ¯æåå·²ç¶åµå»ºäºå ©åå°å ¶ä»æ¨¡åçå¼ç¨ï¼
- ä½è
æ¯å°å®å
Authorä½è 模åå°è±¡çå¼ç¨ï¼ä¸¦ä¸æ¯å¿ è¦çã - ç¨®é¡æ¯å°
Genreç¨®é¡æ¨¡åå°åæ¸çµçå¼ç¨ãæåéæ²æå®£åéåå°è±¡ï¼
æ¸æ¬å¯¦ä¾æ¨¡å
æå¾ï¼è¤è£½ä¸é¢é¡¯ç¤ºçBookInstanceç¶±è¦ä»£ç¢¼ï¼ä¸¦å°å
¶ç²è²¼å°**./models/bookinstance.js**æä»¶ä¸ãBookInstance表示æäººå¯è½èé±çæ¸ç±çç¹å®å¯æ¬ï¼ä¸¦å
嫿éè©²å¯æ¬æ¯å¦å¯ç¨ï¼æé æè¿åæ¥æçè¨æ¯ï¼ãå°è¨ãæçæ¬è©³ç´°è¨æ¯ã
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var BookInstanceSchema = new Schema({
book: { type: Schema.Types.ObjectId, ref: "Book", required: true }, //reference to the associated book
imprint: { type: String, required: true },
status: {
type: String,
required: true,
enum: ["Available", "Maintenance", "Loaned", "Reserved"],
default: "Maintenance",
},
due_back: { type: Date, default: Date.now },
});
// Virtual for bookinstance's URL
BookInstanceSchema.virtual("url").get(function () {
return "/catalog/bookinstance/" + this._id;
});
//Export model
module.exports = mongoose.model("BookInstance", BookInstanceSchema);
æåå¨é裡å±ç¤ºçæ°æ±è¥¿ï¼æ¯å段é¸é ï¼
- æè
enum:éå 許æåè¨ç½®å符串çå 許å¼ãå¨éç¨®æ æ³ä¸ï¼æåç¨å®ä¾æå®æåæ¸ç±çå¯ç¨æ§çæ ï¼ä½¿ç¨æèï¼æå³èæåå¯ä»¥é²æ¢é¯èª¤æ¼å¯«åä»»æå¼ï¼æçºæåççæ ï¼ - é»èªå¼
default:æå使ç¨é»èªå¼ï¼å°æ°åµ å»ºçæ¸æ¬å¯¦ä¾çé»èªçæ ï¼è¨ç½®çºç¶è·ï¼ä¸¦å°é»èªçdue_backæ¥æï¼è¨ç½®çºç¾å¨nowï¼è«æ³¨æå¨è¨ç½®æ¥ææï¼å¦ä½èª¿ç¨ Date 彿¸ï¼ï¼
å ¶ä»ææå §å®¹ï¼å¤§å¤¥æè©²å¨å颿ç¨è£¡éå·²ç¶çæäºã
ç¨®é¡æ¨¡å-èªæææ°!
æéä½ ç**./models/genre.js**æä»¶ï¼ä¸¦åµå»ºä¸ååå²é¡åçç¶±è¦ï¼æ¸æ¬çé¡å¥ï¼ä¾å¦å®æ¯å°èªªéæ¯éå°èªªï¼æµªæ¼«å²æè»äºæ·å²çï¼ã
該å®ç¾©å°èå ¶ä»æ¨¡åé常ç¸ä¼¼ï¼
- 該模åæè©²æä¸ååçº
nameçStringSchemaType ï¼ä¾æè¿°ç¨®é¡ã - éå
nameåæ®µæè©²æ¯å¿ è¦çï¼ä¸¦ä¸æ 3 å° 100 åå符ã - çºé¡åç URL è²æèæ¬ï¼åçº
urlã - å°åºæ¨¡åã
測試âåµå»ºä¸äºé ç®
å°±æ¯é樣ãæåç¾å¨å·²ç¶çºè©²ç¶²ç«å»ºç«äºæææ¨¡åï¼
çºäºæ¸¬è©¦éäºæ¨¡åï¼ä¸¦åµå»ºä¸äºç¤ºä¾æ¸ç±ï¼åå ¶ä»é ç®ä»¥ä¾¿æ¼æåå¨å¾é¢æç« 使ç¨ï¼ï¼ç¾å¨æåå°éè¡ä¸åç¨ç«çè ³æ¬ä¾åµå»ºæ¯ç¨®é¡åçé ç®ï¼
-
å¨ express-locallibrary-tutorial ç®éä¸ï¼è
package.jsonèæ¼åä¸ç´å¥ï¼ï¼ä¸è¼ï¼æä»¥å ¶ä»æ¹å¼åµå»ºï¼æä»¶populatedb.jsãå註ï¼ä½ ä¸éè¦ç¥épopulatedb.jsçå·¥ä½åç;å®åªæ¯å°ç¤ºä¾æ¸ææ·»å å°æ¸æåº«ä¸ã
-
å¨é ç®æ ¹ç®éä¸ï¼è¼¸å ¥ä»¥ä¸å½ä»¤ï¼ä»¥å®è£è ³æ¬æéçç°æ¥æ¨¡å¡ï¼æåå°å¨å¾é¢çæç¨ä¸è¨è«éä¸é»ï¼
bashnpm install async -
å¨å½ä»¤æç¤ºç¬¦ä¸ï¼ä½¿ç¨ node éè¡æ¤è ³æ¬ï¼å³é MongoDB æ¸æåº«ç URLï¼èä¹åå¨
app.js䏿¿æ insert_your_database_url_here ä½ä½ç¬¦çé£åç¸åï¼ï¼bashnode populatedb <your mongodb url> -
è©²è ³æ¬æä¸è·¯éè¡è³å®æï¼ä¸¦å¨çµç«¯ä¸åµå»ºå®åæé¡¯ç¤ºåé ç®ã
å註ï¼è³mLabä¸çæ¸æåº«ãä½ ç¾å¨æè©²å¯ä»¥æ·±å ¥å°æ¸æ¬ç±ï¼ä½è ï¼ç¨®é¡åæ¸æ¬å¯¦ä¾çååéåä¸ï¼ä¸¦æ¥çå®åææªã
總çµ
æ¬æä¸æåå¸å°äºä¸é»æ¸æåº«å Node/Express ç ORMsï¼æ´å¤çæ¯éæ¼å¦ä½å®ç¾© Mongoose ç¶±è¦è模åãç¶å¾æå使ç¨éäºç¥èï¼çºæ¬å°åæ¸é¤¨ç¶²ç«è¨è¨ä¸¦å¯¦ä½åºæ¸æ¬Book,æ¸æ¬å¯¦ä¾BookInstanceï¼ä½è
Authorå種é¡Genre模åã
æå¾ï¼æååµå»ºä¸äºå¯¦ä¾ï¼ä»¥æ¸¬è©¦æ¨¡å(使ç¨ç¨ç«éä½çå½ä»¤ç¨¿)ãä¸ä¸ç¯æç« ï¼æåå°é注æ¼å¦ä½åµå»ºä¸äºç¶²é ï¼ä»¥åç¾éäºç©ä»¶ã
åè¦
- Database integration (Express docs)
- Mongoose website (Mongoose docs)
- Mongoose Guide (Mongoose docs)
- Validation (Mongoose docs)
- Schema Types (Mongoose docs)
- Models (Mongoose docs)
- Queries (Mongoose docs)
- Population (Mongoose docs)