УÑебник Express ÑаÑÑÑ 3: ÐÑполÑзование Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Mongoose)
Ð ÑÑой ÑÑаÑÑе даÑÑÑÑ ÐºÑаÑкое введение в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , и меÑодика Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² пÑиложениÑÑ Node/Express. ÐаÑем Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð¶ÐµÐ¼, как можно иÑполÑзоваÑÑ Mongoose Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к базе даннÑÑ Ð²ÐµÐ±-ÑайÑа LocalLibrary. ÐÑ Ð¾Ð±ÑÑÑним, как обÑÑвлÑÑÑÑÑ ÑÑ ÐµÐ¼Ñ Ð¸ модели обÑекÑов, Ñкажем оÑновнÑе ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð»ÐµÐ¹, и меÑÐ¾Ð´Ð¸ÐºÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ валидаÑии. Ð ÑÑаÑÑе Ñакже кÑаÑко Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾ÑновнÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа к даннÑм модели.
| ÐÑедваÑиÑелÑнÑе ÑведениÑ: | Express Tutorial Part 2: Creating a skeleton website |
|---|---|
| ЦелÑ: | УмеÑÑ ÑпÑоекÑиÑоваÑÑ Ð¸ ÑоздаÑÑ Ñвои модели, иÑполÑзÑÑ Mongoose. |
ÐбзоÑ
СоÑÑÑдники библиоÑеки бÑдÑÑ Ð¸ÑполÑзоваÑÑ ÑÐ°Ð¹Ñ Local Library Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии о ÐºÐ½Ð¸Ð³Ð°Ñ Ð¸ абоненÑÐ°Ñ , а абоненÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки бÑдÑÑ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾ Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа и поиÑка книг, Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии о доÑÑÑпнÑÑ ÐºÐ¾Ð¿Ð¸ÑÑ , Ð´Ð»Ñ ÑезеÑвиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ð´Ð°Ð»Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ½Ð¸Ð³. ЧÑÐ¾Ð±Ñ ÑÑÑекÑивно Ñ ÑаниÑÑ Ð¸ извлекаÑÑ Ð¸Ð½ÑоÑмаÑиÑ, Ð¼Ñ Ð±Ñдем Ñ ÑаниÑÑ ÐµÑ Ð² базе даннÑÑ .
Express-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ ÑазлиÑнÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , и еÑÑÑ Ð½ÐµÑколÑко Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð², коÑоÑÑе можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑий Create, Read, Update and Delete (CRUD) (ÑоздаÑÑ, пÑоÑеÑÑÑ, обновиÑÑ, ÑдалиÑÑ). Ð ÑÑководÑÑве дан кÑаÑкий Ð¾Ð±Ð·Ð¾Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¾ÑÑÑпнÑÑ Ð¾Ð¿Ñий, и деÑалÑно ÑаÑÑмоÑÑÐµÐ½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ ÑабоÑÑ.
Ðакие Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ?
*Express-*пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð»ÑбÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , поддеÑживаемÑе Node (Ñам по Ñебе Express не опÑеделÑÐµÑ ÐºÐ°ÐºÐ¸Ñ -либо конкÑеÑнÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑвойÑÑв и ÑÑебований Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ ). ÐÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ попÑлÑÑнÑÑ Ð²Ð°ÑианÑов â PostgreSQL, MySQL, Redis, SQLite, и MongoDB.
ÐÑи вÑбоÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑледÑÐµÑ ÑÑиÑÑваÑÑ Ñакие ÑакÑоÑÑ ÐºÐ°Ðº вÑÐµÐ¼Ñ ÑазÑабоÑки, вÑÐµÐ¼Ñ Ð¾Ð±ÑÑениÑ, пÑоÑÑоÑа ÑепликаÑии и копиÑованиÑ, ÑаÑÑ Ð¾Ð´Ñ, поддеÑжка ÑообÑеÑÑва и Ñ. д. ХоÑÑ Ð½ÐµÑ ÐµÐ´Ð¸Ð½ÑÑвенной "лÑÑÑей" Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , поÑÑи лÑбое из попÑлÑÑнÑÑ ÑеÑений бÑÐ´ÐµÑ Ð¿ÑиемлемÑм Ð´Ð»Ñ ÑайÑа малого и ÑÑеднего ÑазмеÑа, Ñакого как наÑа Local Library.
Ðолее подÑобно о ваÑианÑÐ°Ñ ÑмоÑÑиÑе в: Database integration (Express docs).
Ðаков наилÑÑÑий ÑпоÑоб взаимодейÑÑÐ²Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ ?
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° пÑи ÑабоÑе Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ :
- ÐÑполÑзование Ñодного ÑзÑка запÑоÑов баз даннÑÑ (Ñ.е. SQL)
- ÐÑполÑзование обÑекÑной модели даннÑÑ (ODM) или обÑекÑно-ÑелÑÑионной модели (ORM). ODM / ORM пÑедÑÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе веб-ÑайÑа как обÑекÑÑ JavaScript, коÑоÑÑе заÑем оÑобÑажаÑÑÑÑ Ð½Ð° поддеÑживаÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐекоÑоÑÑе ORM пÑивÑÐ·Ð°Ð½Ñ Ðº опÑеделÑнной базе даннÑÑ , Ñогда как дÑÑгие не завиÑÑÑ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐаилÑÑÑÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ SQL или дÑÑгого ÑзÑка запÑоÑов, поддеÑживаемого базой даннÑÑ . ÐбÑекÑнÑе модели (ODM) ÑаÑÑо медленнее, поÑÐ¾Ð¼Ñ ÑÑо ÑÑебÑÑÑ Ð¿ÐµÑевода обÑекÑов в ÑоÑÐ¼Ð°Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , пÑи ÑÑом не обÑзаÑелÑно бÑдÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑÑÑекÑивнÑе запÑоÑÑ Ðº базе даннÑÑ (оÑобенно, еÑли ODM пÑедназнаÑена Ð´Ð»Ñ ÑазлиÑнÑÑ Ð±Ð°Ð· даннÑÑ Ð¸ должна идÑи на болÑÑие компÑомиÑÑÑ Ð² ÑмÑÑле поддеÑжки ÑÐµÑ Ð¸Ð»Ð¸ инÑÑ ÑÑнкÑий Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ).
ÐÑеимÑÑеÑÑво пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ORM ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо пÑогÑаммиÑÑÑ Ð¼Ð¾Ð³ÑÑ ÑоÑÑедоÑоÑиÑÑÑÑ Ð½Ð° обÑекÑÐ°Ñ JavaScript, а не на ÑеманÑике Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ â оÑобенно, еÑли ÑÑебÑеÑÑÑ ÑабоÑаÑÑ Ñ ÑазнÑми базами даннÑÑ (на одном или ÑазнÑÑ Ð²ÐµÐ±-ÑайÑÐ°Ñ ). Ðни Ñакже даÑÑ Ð¾Ñевидное меÑÑо Ð´Ð»Ñ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии и пÑовеÑки даннÑÑ .
ÐÑимеÑание: СовеÑ: ÐÑименение ODM / ORMs ÑаÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°ÑÑÐ°Ñ Ð½Ð° ÑазÑабоÑÐºÑ Ð¸ обÑлÑживание! ÐÑли Ð²Ñ Ð½Ðµ оÑÐµÐ½Ñ Ñ Ð¾ÑоÑо Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ñ ÑзÑком запÑоÑов Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð»Ð¸ еÑли пÑоизводиÑелÑноÑÑÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑвоÑÑепенного знаÑениÑ, ÑледÑÐµÑ ÑеÑÑÑзно ÑаÑÑмоÑÑеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ODM.
ÐакÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ ORM/ODM ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ?
ÐÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ODM/ORM доÑÑÑпнÑÑ ÑеÑений на ÑайÑе менеджеÑа пакеÑов NPM (пÑовеÑÑÑе Ñеги по подгÑÑппе odm и orm).
ÐопÑлÑÑнÑе ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑаÑÑи:
- Mongoose: â ÑÑо ÑÑедÑÑво моделиÑование обÑекÑов Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ MongoDB, пÑедназнаÑенное Ð´Ð»Ñ Ð°ÑÐ¸Ð½Ñ Ñонной ÑабоÑÑ.
- Waterline: ORM ÑÑеймвоÑка Sails (оÑнован на Express) . Ðна пÑедоÑÑавлÑÐµÑ ÐµÐ´Ð¸Ð½Ñй API Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к множеÑÑÐ²Ñ Ð±Ð°Ð· даннÑÑ , в Ñом ÑиÑле Redis, mySQL, LDAP, MongoDB, и Postgres.
- Bookshelf: поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ°Ðº promise- Ñак и ÑÑадиÑионнÑе callback- инÑеÑÑейÑÑ, поддеÑжка ÑÑанзакÑий, eager/nested-eager relation loading, полимоÑÑнÑе аÑÑоÑиаÑии, и поддеÑжка, один к одномÑ, один ко многим, и многие ко многим. РабоÑÐ°ÐµÑ Ñ PostgreSQL, MySQL, и SQLite3.
- Objection: ÐÐµÐ»Ð°ÐµÑ Ð½Ð°ÑÑолÑко лÑгким, наÑколÑко возможно, иÑполÑзование вÑей моÑи SQL и движка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ( поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ SQLite3, Postgres, и MySQL).
- Sequelize: ÐÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° пÑомиÑÐ°Ñ ORM Ð´Ð»Ñ Node.js и io.js. ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð¸Ð°Ð»ÐµÐºÑÑ PostgreSQL, MySQL, MariaDB, SQLite и MSSQL, Ð¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð½Ð°Ð´Ñжной поддеÑжкой ÑÑанзакÑий, оÑноÑений, ÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹ и Ñ.д.
- Node ORM2 â ÑÑо OR Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ Ð´Ð»Ñ NodeJS. ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ MySQL, SQLite и Progress, Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑабоÑаÑÑ Ñ ÐÐ, иÑполÑзÑÑ Ð¾Ð±ÑекÑнÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´.
- JugglingDB â ÑÑо кÑоÑÑ-ÐÐ ORM Ð´Ð»Ñ NodeJS, обеÑпеÑиваÑÑÐ°Ñ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к наиболее попÑлÑÑнÑм ÑоÑмаÑам ÐÐ. ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ MySQL, SQLite3, Postgres, MongoDB, Redis и Ñ Ñанение даннÑÑ Ð² памÑÑи js (ÑобÑÑвеннÑй движок, ÑолÑко Ð´Ð»Ñ ÑеÑÑиÑованиÑ).
Ðак пÑавило, пÑи вÑбоÑе ÑеÑÐµÐ½Ð¸Ñ ÑледÑÐµÑ ÑÑиÑÑваÑÑ ÐºÐ°Ðº пÑедоÑÑавлÑемÑе ÑÑнкÑии, Ñак и "деÑÑелÑноÑÑÑ ÑообÑеÑÑва" ( загÑÑзки, вклад, оÑÑÑÑÑ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ , каÑеÑÑво докÑменÑаÑии, и Ñ.д. ) . Ðа Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑаÑÑи Mongoose ÑвлÑлаÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð¿ÑлÑÑной ORM, и ÑазÑмно, еÑли Ð²Ñ Ð²ÑбÑали MongoDB.
ÐÑименение Mongoose и MongoDb Ð´Ð»Ñ LocalLibrary
РпÑимеÑе LocalLibrary (и до конÑа Ñаздела) Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Mongoose ODM Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к даннÑм наÑей библиоÑеки. Mongoose ÑвлÑеÑÑÑ Ð¸Ð½ÑеÑÑейÑом Ð´Ð»Ñ MongoDB, NoSQL-Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ñ Ð¾ÑкÑÑÑÑм иÑÑ Ð¾Ð´Ð½Ñм кодом, в коÑоÑой иÑполÑзована докÑменÑов-оÑиенÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ . Ð MongoDB «коллекÑии» и «докÑменÑÑ» â ÑÑо аналоги «ÑаблиÑ» и «ÑÑÑок» в ÑелÑÑионнÑÑ ÐÐ.
ÐÑо ÑоÑеÑание ODM и ÐРвеÑÑма попÑлÑÑно в ÑообÑеÑÑве Node, ÑаÑÑиÑно поÑомÑ, ÑÑо ÑиÑÑема Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ÐºÑменÑов и запÑоÑов оÑÐµÐ½Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð° на JSON и поÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼Ð° ÑазÑабоÑÑикам JavaScript.
ÐÑимеÑание: Ðе обÑзаÑелÑно знаÑÑ MongoDB, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Mongoose, Ñ Ð¾ÑÑ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ Mongoose легÑе иÑполÑзоваÑÑ Ð¸ понимаÑÑ, еÑли Ð²Ñ Ñже Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ñ MongoDB.
Ðалее показано, как опÑеделиÑÑ Ð¸ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑ ÐµÐ¼Ðµ и моделÑм Mongoose Ð´Ð»Ñ Ð¿ÑимеÑа веб-ÑайÑа LocalLibrary.
ÐÑоекÑиÑование моделей LocalLibrary
ÐÑежде Ñем наÑинаÑÑ Ð¿Ð¸ÑаÑÑ ÐºÐ¾Ð´ моделей, ÑÑÐ¾Ð¸Ñ Ð¾Ð±Ð´ÑмаÑÑ, какие даннÑе нам нÑжно Ñ ÑаниÑÑ, и ÐºÐ°ÐºÐ¾Ð²Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑазнÑми обÑекÑами.
ÐÑ Ð·Ð½Ð°ÐµÐ¼, ÑÑо нÑжно Ñ ÑаниÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÐºÐ½Ð¸Ð³Ð°Ñ (название, ÑезÑме (кÑаÑкое опиÑание), авÑоÑ, жанÑ, ISBN (ÐеждÑнаÑоднÑй ÑÑандаÑÑнÑй книжнÑй номеÑ) ) и ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко доÑÑÑпнÑÑ ÑкземплÑÑов (Ñ ÑникалÑнÑми иденÑиÑикаÑоÑами, ÑÑаÑÑÑом налиÑÐ¸Ñ Ð¸ Ñ. д.). ÐÐ¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ñ ÑаниÑÑ Ð±Ð¾Ð»ÑÑе инÑоÑмаÑии об авÑоÑе (не ÑолÑко имÑ, Ñ.к. могÑÑ Ð±ÑÑÑ Ð°Ð²ÑоÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми или Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð¼Ð¸ именами). ÐÑ Ñ Ð¾Ñим имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑоÑÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе по названиÑм книг, по авÑоÑам, по жанÑам и каÑегоÑиÑм.
ÐÑи пÑоекÑиÑовании моделей Ð¸Ð¼ÐµÐµÑ ÑмÑÑл имеÑÑ Ð¾ÑделÑнÑе модели Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ «обÑекÑа» (гÑÑÐ¿Ð¿Ñ ÑвÑзаннÑÑ Ð´Ð°Ð½Ð½ÑÑ ). Ð ÑÑом ÑлÑÑае оÑевиднÑми обÑекÑами ÑвлÑÑÑÑÑ ÐºÐ½Ð¸Ð³Ð¸, ÑкземплÑÑÑ ÐºÐ½Ð¸Ð³ и авÑоÑÑ.
Ðожно Ñакже иÑполÑзоваÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов ÑпиÑка вÑбоÑа (напÑимеÑ, как вÑпадаÑÑий ÑпиÑок ваÑианÑов), вмеÑÑо жÑÑÑкого кодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑбоÑа на Ñамом веб-ÑайÑе - ÑекомендÑеÑÑÑ, когда не вÑе паÑамеÑÑÑ Ð¸Ð·Ð²ÐµÑÑÐ½Ñ Ð¸Ð»Ð¸ могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. ЯвнÑй ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñакого Ñипа â ÑÑо Ð¶Ð°Ð½Ñ ÐºÐ½Ð¸Ð³Ð¸ (напÑимеÑ, «ÐаÑÑÐ½Ð°Ñ ÑанÑаÑÑика», «ФÑанÑÑзÑÐºÐ°Ñ Ð¿Ð¾ÑзиÑ» и Ñ.д.),
Ðак ÑолÑко Ð¼Ñ Ð¾Ð¿ÑеделилиÑÑ Ñ Ð¼Ð¾Ð´ÐµÐ»Ñми и полÑми, ÑледÑÐµÑ Ð¿Ð¾Ð´ÑмаÑÑ Ð¾Ð± оÑноÑениÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸.
С ÑÑÑÑом Ñказанного, UML-диагÑамма ÑвÑзей (Ñм. ниже) показÑÐ²Ð°ÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸, коÑоÑÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÐºÐ°Ðº пÑÑмоÑголÑники. ÐÑ ÑеÑили, ÑÑо Ñоздадим модели Ð´Ð»Ñ ÐºÐ½Ð¸Ð³Ð¸ (обÑие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ книге), Ð´Ð»Ñ ÑкземплÑÑа книги (ÑоÑÑоÑние оÑделÑнÑÑ
ÑизиÑеÑкиÑ
копий книги, доÑÑÑпнÑÑ
в ÑиÑÑеме) и Ð´Ð»Ñ Ð°Ð²ÑоÑа. ÐÑоме Ñого, Ñ Ð½Ð°Ñ Ð±ÑÐ´ÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð´Ð»Ñ Ð¶Ð°Ð½Ñа, ÑÑÐ¾Ð±Ñ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло ÑоздаваÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки. РеÑено не ÑоздаваÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð´Ð»Ñ BookInstance:status â Ð¼Ñ Ð¿ÑопиÑем в коде необÑ
одимÑе знаÑениÑ, поÑÐ¾Ð¼Ñ ÑÑо не ожидаем иÑ
изменениÑ. Ðа ÑлеменÑаÑ
диагÑÐ°Ð¼Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¸Ð¼Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸, имена и ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð»ÐµÐ¹, имена меÑодов и ÑÐ¸Ð¿Ñ Ð¸Ñ
ÑезÑлÑÑаÑов .
Также Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¾Ð´ÐµÐ»Ñми, вклÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑе оÑноÑениÑ. ЧиÑла на линиÑÑ
ÑвÑзи показÑваÑÑ Ð¼Ð°ÐºÑимÑм и минимÑм моделей, ÑÑаÑÑвÑÑÑиÑ
оÑноÑении. ÐапÑимеÑ, Ð»Ð¸Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Book и Genre показÑваеÑ, ÑÑо Book и Genre ÑвÑзанÑ. ЧиÑла на ÑÑой линии ÑÑдом Ñ Ð¼Ð¾Ð´ÐµÐ»ÑÑ Book показÑваÑÑ, ÑÑо Ð¶Ð°Ð½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑвÑзан Ñ Ð»ÑбÑм колиÑеÑÑвом книг, а ÑиÑла на дÑÑгом конÑе линии ÑÑдом Ñ Genre оÑмеÑаÑÑ, ÑÑо книга Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑвÑзана Ñ Ð»ÑбÑм колиÑеÑÑвом жанÑов.
ÐÑимеÑание:
Ðак показано в УÑебнике по Mongoose ниже, ÑаÑÑо лÑÑÑе имеÑÑ Ð¿Ð¾Ð»Ðµ, опÑеделÑÑÑее оÑноÑение Ð¼ÐµÐ¶Ð´Ñ Ð´Ð¾ÐºÑменÑами (моделÑми), ÑолÑко в одной модели (обÑаÑное оÑноÑение можно найÑи по пÑиÑÐ²Ð¾ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ _id в дÑÑгой модели). Ðиже Ð¼Ñ Ð¿ÑедпоÑли задаÑÑ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Book/Genre и Ð¼ÐµÐ¶Ð´Ñ Book/Author в ÑÑ
еме Book, а оÑноÑение Ð¼ÐµÐ¶Ð´Ñ Book/BookInstance â в ÑÑ
еме BookInstance. ÐÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð² некоÑоÑом ÑмÑÑле бÑл пÑоизволÑнÑм â Ñаким же Ñ
оÑоÑим мог Ð±Ñ Ð±ÑÑÑ Ð²ÑÐ±Ð¾Ñ Ð´ÑÑгого Ð¿Ð¾Ð»Ñ Ð² дÑÑгой ÑÑ
еме.

ÐÑимеÑание: Ð ÑледÑÑÑем Ñазделе дан базовÑй ÑÑебник, в коÑоÑом обÑÑÑнÑеÑÑÑ, как задаваÑÑ Ð¸ как иÑполÑзоваÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸. ÐÑи ÑÑении обÑаÑиÑе внимание, как бÑдÑÑ ÑоздаваÑÑÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸, пÑиведÑннÑе на диагÑамме.
УÑебник по Mongoose
Ð ÑÑом Ñазделе кÑаÑко опиÑано как подклÑÑиÑÑÑÑ Ðº базе MongoDB Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Mongoose, как опÑеделиÑÑ ÑÑ ÐµÐ¼Ñ Ð¸ модели, как ÑÑоÑмиÑоваÑÑ Ð¾ÑновнÑе запÑоÑÑ.
ÐÑимеÑание: Ðа ÑÑÐ¾Ñ ÑÑебник знаÑиÑелÑно повлиÑло ÑÑководÑÑво Mongoose quick start на npm и оÑиÑиалÑÐ½Ð°Ñ Ð´Ð¾ÐºÑменÑаÑиÑ.
УÑÑановка Mongoose и MongoDB
Mongoose ÑÑÑанавливаеÑÑÑ Ð² Ð²Ð°Ñ Ð¿ÑÐ¾ÐµÐºÑ (package.json) как и дÑÑгие завиÑимоÑÑи - пÑи помоÑи NPM. Ðоманда ÑÑÑановки (вÑполнÑеÑÑÑ Ð¸Ð· каÑалога пÑоекÑа):
npm install mongoose
УÑÑановка Mongoose Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ð²Ñе завиÑимоÑÑи, вклÑÑÐ°Ñ Ð´ÑÐ°Ð¹Ð²ÐµÑ MongoDB, но не ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ ÑÐ°Ð¼Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑи желании ÑÑÑановиÑÑ ÑеÑÐ²ÐµÑ MongoDB локалÑно, можно ÑкаÑаÑÑ ÑÑÑановоÑнÑй Ñайл здеÑÑ Ð´Ð»Ñ Ñвоей опеÑаÑионной ÑиÑÑÐµÐ¼Ñ Ð¸ ÑÑÑановиÑÑ ÐµÐ³Ð¾. Также можно иÑполÑзоваÑÑ Ð¾Ð±Ð»Ð°ÐºÐ¾ MongoDB.
ÐÑимеÑание: РпÑимеÑе Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ñ Ð¸ÑполÑзÑем облаÑнÑй ÑеÑÐ²Ð¸Ñ sandbox tier ("пеÑоÑниÑÑ"). ÐÑо Ñдобно Ð´Ð»Ñ ÑазÑабоÑки и Ð¸Ð¼ÐµÐµÑ ÑмÑÑл Ð´Ð»Ñ ÑÑководÑÑва, поÑÐ¾Ð¼Ñ ÑÑо Ñакой Ð¿Ð¾Ð´Ñ Ð¾Ð´ Ð´ÐµÐ»Ð°ÐµÑ "ÑÑÑановкÑ" Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимой Ð¾Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑÐµÐ¼Ñ (база даннÑÑ ÐºÐ°Ðº веб-ÑеÑÐ²Ð¸Ñ â ÑÑо Ñакже Ð¿Ð¾Ð´Ñ Ð¾Ð´, коÑоÑÑй Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð»Ñ Ñвоей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ð½Ð°Ñ Ð¾Ð´ÑÑейÑÑ Ð² ÑеалÑной ÑкÑплÑаÑаÑии).
ÐодклÑÑение к MongoDB
Mongoose ÑÑебÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к MongoDB. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ require() и подклÑÑиÑÑÑ Ðº локалÑной ÐРпÑи помоÑи mongoose.connect(), как показано ниже.
// ÐмпоÑÑиÑоваÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ mongoose
var mongoose = require("mongoose");
// УÑÑановим подклÑÑение по ÑмолÑаниÑ
var mongoDB = "mongodb://127.0.0.1/my_database";
mongoose.connect(mongoDB);
// Ðозволим Mongoose иÑполÑзоваÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Ð¿ÑомиÑов
mongoose.Promise = global.Promise;
// ÐолÑÑение подклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
var db = mongoose.connection;
// ÐÑивÑзаÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к ÑобÑÑÐ¸Ñ Ð¾Ñибки (полÑÑаÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
подклÑÑениÑ)
db.on("error", console.error.bind(console, "MongoDB connection error:"));
ÐÑи помоÑи mongoose.connection можно полÑÑиÑÑ ÑÑандаÑÑнÑй обÑÐµÐºÑ Connection. ÐоÑле подклÑÑÐµÐ½Ð¸Ñ Ð² ÑкземплÑÑе Connection Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ ÑобÑÑие open (оÑкÑÑÑ).
ÐÑимеÑание:
ÐÑли необÑ
одимо ÑоздаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе подклÑÑениÑ, можно иÑполÑзоваÑÑ mongoose.createConnection(). ÐÑи ÑÑом бÑдÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ Ñе же ÐÐ URI (Ñ
оÑÑ, ÐÐ, поÑÑ, опÑии и Ñ.д.), ÑÑо и в connect() и бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн обÑÐµÐºÑ Connection.
ÐпÑеделение и Ñоздание моделей
Ðодели можно ÑоздаÑÑ Ð¿Ñи помоÑи инÑеÑÑейÑа Schema . Schema позволÑÐµÑ ÑказаÑÑ Ð¿Ð¾Ð»Ñ, коÑоÑÑе бÑдÑÑ Ð² каждом докÑменÑе, знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ валидаÑии. ÐÑоме Ñого, можно задаÑÑ ÑÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸ меÑодÑ-Ñ
елпеÑÑ (Ð¾Ñ help), облегÑаÑÑие ÑабоÑÑ Ñ Ð²Ð°Ñими Ñипами даннÑÑ
, а Ñакже задаÑÑ Ð²Ð¸ÑÑÑалÑнÑе ÑвойÑÑва, коÑоÑÑе можно иÑполÑзоваÑÑ ÐºÐ°Ðº и обÑÑнÑе полÑ, но без влиÑÐ½Ð¸Ñ Ð½Ð° даннÑе в Ñамой базе даннÑÑ
.
СÑ
ÐµÐ¼Ñ "компилиÑÑÑÑÑÑ " в оконÑаÑелÑнÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¼ÐµÑодом mongoose.model(). ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, ÑозданиÑ, Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов данного Ñипа.
ÐÑимеÑание:
Ðаждой модели ÑооÑвеÑÑÑвÑÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð´Ð¾ÐºÑменÑов в ÐÐ MongoDB. ÐокÑменÑÑ Ð±ÑдÑÑ ÑодеÑжаÑÑ Ð¿Ð¾Ð»Ñ ÑеÑ
Ñипов, коÑоÑÑе Ð·Ð°Ð´Ð°Ð½Ñ Ð² модели Schema.
ÐпÑеделение ÑÑ ÐµÐ¼ даннÑÑ
Ðод ниже показÑваеÑ, как можно задаÑÑ Ð¿ÑоÑÑÑÑ ÑÑ
емÑ. СнаÑала пÑи помоÑи require() ÑоздаÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ mongoose, заÑем конÑÑÑÑкÑÐ¾Ñ Schema ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑкземплÑÑ ÑÑ
емÑ, пÑи ÑÑом ÑазлиÑнÑе Ð¿Ð¾Ð»Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ ÐºÐ°Ðº паÑамеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа.
//ТÑебÑеÑÑÑ Mongoose
var mongoose = require("mongoose");
//ÐпÑеделÑем ÑÑ
емÑ
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
РпÑимеÑе ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð´Ð²Ð° полÑ, Ñипа String и Ñипа Date. Ð ÑледÑÑÑем Ñазделе бÑдÑÑ Ð¿ÑимеÑÑ Ð¿Ð¾Ð»ÐµÐ¹ дÑÑÐ³Ð¸Ñ Ñипов, Ð¸Ñ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии и пÑимеÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¼ÐµÑодов.
Создание модели
Ðодели ÑоздаÑÑÑÑ Ð¸Ð· ÑÑ
ем меÑодом mongoose.model():
// ÐпÑеделÑем ÑÑ
емÑ
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
// ÐомпилиÑÑем Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¸Ð· ÑÑ
емÑ
var SomeModel = mongoose.model("SomeModel", SomeModelSchema);
ÐеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ - ÑникалÑное Ð¸Ð¼Ñ Ñоздаваемой Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ коллекÑии(Mongoose ÑоздаÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ SomeModel), вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ - ÑÑ ÐµÐ¼Ð°, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸.
ÐÑимеÑание: ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑов модели они могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ ÑозданиÑ, Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей в базе, Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов по вÑем запиÑÑм или по Ð¸Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑвам. Ðак ÑÑо делаÑÑ, бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ в Ñазделе ÐÑполÑзование моделей, и когда бÑдÑÑ ÑоздаваÑÑÑÑ Ð¿ÑедÑÑавлениÑ.
Ð¢Ð¸Ð¿Ñ ÑÑ ÐµÐ¼Ñ (полÑ)
Ð¡Ñ ÐµÐ¼Ð° Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð»Ñбое колиÑеÑÑво полей, пÑиÑÑм каждое поле бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ¼ докÑменÑа, Ñ Ñанимого в ÐÐ 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: ÐÑедÑÑавлÑÐµÑ Ð¾ÑделÑнÑй ÑкземплÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ в ÐÐ. ÐапÑимеÑ, book Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° обÑекÑ- авÑоÑа. Ðоле бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑникалÑнÑй иденÑиÑикаÑÐ¾Ñ (_id) оÑделÑного обÑекÑа. ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑой инÑоÑмаÑии пÑименÑÑÑ Ð¼ÐµÑодpopulate().- Mixed: ÐÑоизволÑнÑй Ñип в ÑÑ ÐµÐ¼Ðµ.
- []: ÐаÑÑив ÑлеменÑов. Ð ÑÐ°ÐºÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ»ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑполнÑÑÑ JavaScript-опеÑаÑии Ð´Ð»Ñ Ð¼Ð°ÑÑивов (push, pop, unshift, etc.). ÐÑÑе показан пÑÐ¸Ð¼ÐµÑ Ð¼Ð°ÑÑива обÑекÑов неопÑеделÑнного Ñипа и маÑÑив ÑÑÑок, но можно иÑполÑзоваÑÑ Ð¼Ð°ÑÑив обÑекÑов лÑбого Ñипа.
Ðод ÑодеÑÐ¶Ð¸Ñ Ñакже два ÑпоÑоба обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹:
- ÐÐ¼Ñ Ð¸ Ñип Ð¿Ð¾Ð»Ñ ÐºÐ°Ðº паÑа "клÑÑ-знаÑение" (полÑ
name,binary иliving). - ÐÐ¼Ñ Ð¿Ð¾Ð»Ñ, поÑле коÑоÑого ÑказÑваеÑÑÑ Ð¾Ð±ÑекÑ, опÑеделÑÑÑий Ñип и дÑÑгие возможноÑÑи полÑ, Ñакие как:
- знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
- вÑÑÑоеннÑе валидаÑоÑÑ (напÑимеÑ, знаÑÐµÐ½Ð¸Ñ max и min) и ÑÑнкÑии-валидаÑоÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ.
- ЯвлÑеÑÑÑ Ð»Ð¸ поле обÑзаÑелÑнÑм
- ÐÐ¾Ð»Ð¶Ð½Ñ Ð»Ð¸ ÑÑÑоковÑе Ð¿Ð¾Ð»Ñ Ð°Ð²ÑомаÑиÑеÑки пÑеобÑазовÑваÑÑÑÑ Ð² нижний или веÑÑ
ний ÑегиÑÑÑ, ÑдалÑÑÑ Ð»Ð¸ ведÑÑие и Ñ
воÑÑовÑе пÑÐ¾Ð±ÐµÐ»Ñ (
пÑимеÑ:{ type: String, lowercase: true, trim: true })
ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ - в SchemaTypes (докÑменÑаÑÐ¸Ñ Mongoose).
ÐалидаÑÐ¸Ñ (пÑовеÑка допÑÑÑимоÑÑи)
Mongoose пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð²ÑÑÑоеннÑе валидаÑоÑÑ, валидаÑоÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, ÑÐ¸Ð½Ñ ÑоннÑе и аÑÐ¸Ð½Ñ ÑоннÑе валидаÑоÑÑ. Ðо вÑÐµÑ ÑлÑÑаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð´Ð¾Ð¿ÑÑÑимÑе Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¸Ð»Ð¸ знаÑениÑ, а Ñакже ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ Ð¿Ñи наÑÑÑении ÑÑловий валидаÑии.
ÐÑÑÑоеннÑе валидаÑоÑÑ Ð²ÐºÐ»ÑÑаÑÑ:
- ÐÑе SchemaTypes имеÑÑ Ð²ÑÑÑоеннÑй валидаÑÐ¾Ñ required, коÑоÑÑй опÑеделÑеÑ, должно ли поле бÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пеÑед ÑÐ¾Ñ Ñанением докÑменÑа.
- ЧиÑла имеÑÑ Ð²Ð°Ð»Ð¸Ð´Ð°ÑоÑÑ min и max.
- СÑÑоки имеÑÑ:
- enum (пеÑеÑиÑлениÑ): задаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво допÑÑÑимÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ð·Ð½Ð°Ñений.
- match (ÑооÑвеÑÑÑвиÑ)): задаÑÑ ÑегÑлÑÑное вÑÑажение, коÑоÑÐ¾Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑооÑвеÑÑÑвоваÑÑ ÑÑÑока.
- maxlength, minlength -макÑималÑÐ½Ð°Ñ Ð¸ минималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑÑÑоки.
ÐÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ (Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑими изменениÑми из докÑменÑаÑии 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',]
}
});
ÐодÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿Ð¾ валидаÑии полей - в Ñазделе Validation (докÑменÑаÑÐ¸Ñ Mongoose).
ÐиÑÑÑалÑнÑе ÑвойÑÑва
ÐиÑÑÑалÑнÑе ÑвойÑÑва - ÑÑо ÑвойÑÑва докÑменÑа, коÑоÑÑе можно ÑиÑаÑÑ (get) и задаваÑÑ (set), но коÑоÑÑе не Ñ ÑанÑÑÑÑ Ð² MongoDB. ÐеÑÐ¾Ð´Ñ "геÑÑеÑÑ" Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹, а "ÑеÑÑеÑÑ" пÑименÑÑÑ Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñии оÑделÑнÑÑ Ð·Ð½Ð°Ñений на неÑколÑко ÑаÑÑей пеÑед ÑÐ¾Ñ Ñанением в ÐÐ. ÐÑÐ¸Ð¼ÐµÑ Ð¸Ð· докÑменÑаÑии ÑобиÑÐ°ÐµÑ (и ÑазбиÑаеÑ) виÑÑÑалÑное ÑвойÑÑво "полное имÑ" из полей "имÑ" и "ÑамилиÑ", ÑÑо Ñдобнее, Ñем конÑÑÑÑиÑоваÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ Ð¸Ð¼Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда оно иÑполÑзÑеÑÑÑ Ð² Ñаблоне.
ÐÑимеÑание:
РбиблиоÑеке виÑÑÑалÑное ÑвойÑÑво бÑÐ´ÐµÑ Ð¿Ñименено Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑникалÑного URL каждой запиÑи в модели по пÑÑи и по знаÑÐµÐ½Ð¸Ñ _id запиÑи.
ÐодÑÐ¾Ð±Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ - в Ñазделе Virtuals (докÑменÑаÑÐ¸Ñ Mongoose).
ÐеÑÐ¾Ð´Ñ Ð¸ помоÑники запÑоÑов
Ð ÑÑ
еме можно Ñакже задаÑÑ Ð¼ÐµÑÐ¾Ð´Ñ ÑкземплÑÑа (instance methods), ÑÑаÑиÑеÑкие (static) меÑÐ¾Ð´Ñ Ð¸ помоÑники запÑоÑов. СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸ меÑÐ¾Ð´Ñ ÑкземплÑÑа аналогиÑнÑ, но ÑазлиÑаÑÑÑÑ Ñем, ÑÑо меÑÐ¾Ð´Ñ ÑкземплÑÑа ÑвÑÐ·Ð°Ð½Ñ Ñ ÐºÐ¾Ð½ÐºÑеÑной запиÑÑÑ Ð¸ имеÑÑ Ð´Ð¾ÑÑÑп к ÑекÑÑÐµÐ¼Ñ Ð¾Ð±ÑекÑÑ. ÐомоÑники запÑоÑов позволÑÑÑ ÑаÑÑиÑиÑÑ API поÑÑÑоиÑÐµÐ»Ñ ÑепоÑек запÑоÑов (напÑимеÑ, можно добавиÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ "byName" ("по имени") в дополнение к меÑодам find(), findOne() и findById()).
ÐÑименение моделей
ÐодгоÑовленнÑÑ ÑÑ ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹. ÐÐ¾Ð´ÐµÐ»Ñ Ð¿ÑедÑÑавлÑÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð´Ð¾ÐºÑменÑов в базе даннÑÑ , в коÑоÑой можно вÑполнÑÑÑ Ð¿Ð¾Ð¸Ñк, Ñогда как ÑкземплÑÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ пÑедÑÑавлÑÑÑ Ð¾ÑделÑнÑе докÑменÑÑ, коÑоÑÑе можно ÑÐ¾Ñ ÑанÑÑÑ Ð¸ извлекаÑÑ.
Ðиже пÑедлагаеÑÑÑ ÐºÑаÑкий обзоÑ. Ðолее подÑобно ÑмоÑÑиÑе в Models (докÑменÑаÑÐ¸Ñ Mongoose).
Создание и изменение докÑменÑов
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ, ÑледÑÐµÑ Ð¾Ð¿ÑеделиÑÑ ÑкземплÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ и вÑзваÑÑ Ð¼ÐµÑод save(). РпÑимеÑе ниже SomeModel â ÑÑо Ð¼Ð¾Ð´ÐµÐ»Ñ Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм полем "name", коÑоÑÑÑ Ð¼Ñ Ñоздадим из наÑей ÑÑ
емÑ.
// СоздаÑÑ ÑкземплÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ SomeModel
var awesome_instance = new SomeModel({ name: "awesome" });
// СоÑ
ÑаниÑÑ Ð½Ð¾Ð²Ñй ÑкземплÑÑ, пеÑедав callback
awesome_instance.save(function (err) {
if (err) return handleError(err);
// ÑоÑ
Ñанили!
});
Создание запиÑей (а Ñакже обновлениÑ, ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ запÑоÑÑ) - ÑÑо аÑÐ¸Ð½Ñ ÑоннÑе опеÑаÑии, поÑÑÐ¾Ð¼Ñ ÑледÑÐµÑ Ð¿ÑедÑÑмоÑÑеÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана пÑи завеÑÑении опеÑаÑии. Ð API иÑполÑзÑеÑÑÑ ÑоглаÑение о пеÑвом аÑгÑменÑе, ÑоглаÑно коÑоÑÐ¾Ð¼Ñ Ð¿ÐµÑвÑй аÑгÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑии должен бÑÑÑ Ð·Ð½Ð°Ñением оÑибки (или null). ÐÑли API возвÑаÑÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑй ÑезÑлÑÑаÑ, он должен бÑÑÑ Ð²ÑоÑÑм аÑгÑменÑом.
Ðожно иÑполÑзоваÑÑ Ð¼ÐµÑод create() Ð´Ð»Ñ Ñоздании ÑкземплÑÑа модели пÑи его ÑоÑ
Ñанении. Тогда колбÑк-ÑÑнкÑÐ¸Ñ Ð²ÐµÑнÑÑ Ð¾ÑÐ¸Ð±ÐºÑ (или null) как пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¸ ÑолÑко ÑÑо ÑозданнÑй ÑкземплÑÑ ÐºÐ°Ðº вÑоÑой аÑгÑменÑ.
SomeModel.create({ name: "also_awesome" }, function (err, awesome_instance) {
if (err) return handleError(err);
// ÑоÑ
Ñанили!
});
ÐÐ°Ð¶Ð´Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð°ÑÑоÑииÑована Ñ Ñоединением (Ñ Ñоединением по ÑмолÑаниÑ, еÑли иÑполÑзÑеÑÑÑ mongoose.model()). СледÑÐµÑ ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ Ñоединение и вÑзваÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ .model(), ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð² дÑÑгой базе даннÑÑ
.
ÐÐ¾Ð»Ñ Ð² новой запиÑи могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ñ Ð¿Ñименением dot (ÑоÑка)-ÑинÑакÑиÑа. ÐÐ»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÑлÑÐ¶Ð°Ñ Ð¼ÐµÑÐ¾Ð´Ñ save() и update().
// ÐоÑÑÑп к полÑм модели в dot-ноÑаÑии
console.log(awesome_instance.name); //вÑвод в конÑÐ¾Ð»Ñ 'also_awesome'
// ÐзмениÑÑ Ð·Ð°Ð¿Ð¸ÑÑ, модиÑиÑиÑÑÑ Ð¿Ð¾Ð»Ñ, поÑом вÑзваÑÑ save().
awesome_instance.name = "New cool name";
awesome_instance.save(function (err) {
if (err) return handleError(err); // ÑоÑ
Ñанили!
});
ÐоиÑк запиÑей
ÐÑи поиÑке запиÑей меÑодами запÑоÑов, ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð¸Ñка ÑледÑÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ ÐºÐ°Ðº докÑÐ¼ÐµÐ½Ñ JSON. ÐÑиведÑннÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð° (ниже) показÑваеÑ, как в ÐРнайÑи имена (name) и возÑаÑÑ (age) вÑÐµÑ ÑпоÑÑÑменов-ÑенниÑиÑÑов. СооÑвеÑÑÑвие бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð»Ñ (sport), но можно добавиÑÑ ÐºÑиÑеÑии поиÑка, задав, напÑимеÑ, ÑегÑлÑÑное вÑÑажение, или ÑдалиÑÑ Ð²Ñе кÑиÑеÑии, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑпиÑок вÑÐµÑ ÑпоÑÑÑменов.
var Athlete = mongoose.model("Athlete", yourSchema);
// найÑи вÑеÑ
ÑенниÑиÑÑов, вÑбиÑаÑÑ Ð¿Ð¾Ð»Ñ 'name' и 'age'
Athlete.find({ sport: "Tennis" }, "name age", function (err, athletes) {
if (err) return handleError(err);
// 'athletes' ÑодеÑÐ¶Ð¸Ñ ÑпиÑок ÑпоÑÑÑменов, ÑооÑвеÑÑÑвÑÑÑиÑ
кÑиÑеÑиÑ.
});
ÐÑли задаÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑÐ¸Ñ Ñак, как показано вÑÑе, запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²Ñполнен немедленно. Ðднако колбÑк-ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана ÑолÑко поÑле завеÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка.
ÐÑимеÑание:
ÐÑе колбÑк-ÑÑнкÑии в Mongoose иÑполÑзÑÑÑ Ð¾Ð±ÑÐ°Ð·ÐµÑ callback(error, result). ÐÑли пÑи вÑполнении запÑоÑа Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, паÑамеÑÑ error бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¾Ð±ÑÐµÐºÑ error, а result бÑÐ´ÐµÑ null. ÐÑи ÑÑпеÑном запÑоÑе паÑамеÑÑ error бÑÐ´ÐµÑ null, а result бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑа.
ÐÑли не задаÑÑ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑиÑ, API веÑнÑÑ Ð¿ÐµÑеменнÑÑ Ñипа Query. Ðожно иÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ Ð·Ð°Ð¿ÑоÑа, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¸ вÑполниÑÑ Ñвой запÑÐ¾Ñ (Ñ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑией) позже, пÑи помоÑи меÑода exec().
// найÑи вÑеÑ
ÑенниÑиÑÑов
var query = Athlete.find({ sport: "Tennis" });
// вÑбÑаÑÑ Ð¿Ð¾Ð»Ñ 'name' и 'age'
query.select("name age");
// огÑаниÑиÑÑ ÑезÑлÑÑÐ°Ñ 5 ÑлеменÑами
query.limit(5);
// ÑоÑÑиÑоваÑÑ Ð¿Ð¾ возÑаÑÑÑ
query.sort({ age: -1 });
// вÑполниÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾Ð·Ð¶Ðµ
query.exec(function (err, athletes) {
if (err) return handleError(err);
// athletes ÑодеÑÐ¶Ð¸Ñ ÑпоÑÑдоÑеннÑй ÑпиÑок из 5 ÑенниÑиÑÑов
});
ÐÑÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð¸Ñка бÑли Ð·Ð°Ð´Ð°Ð½Ñ Ð² меÑоде find(). Ðожно Ñакже иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ where(), кÑоме Ñого, можно ÑоединиÑÑ Ð²Ñе ÑаÑÑи в одном запÑоÑе пÑименением опеÑаÑоÑа dot (.) вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð²ÑполнÑÑÑ Ð¸Ñ
ÑазделÑно. ФÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð° (Ñм. ниже) вÑполнÑÐµÑ ÑÐ¾Ñ Ð¶Ðµ запÑоÑ, ÑÑо и пÑедÑдÑÑий ÑÑагменÑ, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм ÑÑловием Ð´Ð»Ñ Ð²Ð¾Ð·ÑаÑÑа.
Athlete.
find().
where('sport').equals('Tennis').
where('age').gt(17).lt(50). //ÐополниÑелÑное ÑÑловие
limit(5).
sort({ age: -1 }).
select('name age').
exec(callback); // callback - Ð¸Ð¼Ñ Ð½Ð°Ñей колбÑк-ÑÑнкÑии.
ÐеÑод find() Ð½Ð°Ñ Ð¾Ð´Ð¸Ñ Ð²Ñе запиÑи, ÑдовлеÑвоÑÑÑÑие ÑÑловиÑ, но ÑаÑÑо ÑÑебÑеÑÑÑ Ð½Ð°Ð¹Ñи ÑолÑко Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿Ð¸Ñей. ÐÐ¾Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка одной запиÑи:
findById(): ÐÐ°Ñ Ð¾Ð´Ð¸Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑid(каждÑй докÑÐ¼ÐµÐ½Ñ Ð¸Ð¼ÐµÐµÑ ÑникалÑнÑй иденÑиÑикаÑоÑid).findOne(): ÐÐ°Ñ Ð¾Ð´Ð¸Ñ Ð¾Ð´Ð¸Ð½ докÑменÑ, ÑдовлеÑвоÑÑÑÑий Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÑиÑеÑиÑ.findByIdAndRemove(),findByIdAndUpdate(),findOneAndRemove(),findOneAndUpdate(): ÐÐ°Ñ Ð¾Ð´Ð¸Ñ Ð¾Ð´Ð¸Ð½ докÑÐ¼ÐµÐ½Ñ Ð¿Ð¾idили по кÑиÑеÑиÑ, а заÑем или обновлÑеÑ, или ÑдалÑÐµÑ ÐµÐ³Ð¾. ÐÑи меÑÐ¾Ð´Ñ Ð²ÐµÑÑма Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей.
ÐÑимеÑание:
ÐÑÑÑ Ñакже меÑод count(), коÑоÑÑй опÑеделÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запиÑей, ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑловиÑ. Ðн полезен пÑи вÑполнении подÑÑÑÑов без ÑакÑиÑеÑкого извлеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей.
ÐапÑоÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð¸ во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð´ÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ . ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ - в Queries (докÑменÑаÑÐ¸Ñ Mongoose).
РабоÑа Ñо ÑвÑзаннÑми докÑменÑами â загÑÑзка
Ðдин докÑÐ¼ÐµÐ½Ñ (ÑкземплÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸) Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° дÑÑгой докÑÐ¼ÐµÐ½Ñ Ð¿Ñи помоÑи Ð¿Ð¾Ð»Ñ ObjectId ÑÑ
емÑ, или на много дÑÑгиÑ
докÑменÑов, иÑполÑзÑÑ Ð¼Ð°ÑÑив иденÑиÑикаÑоÑов ObjectIds. ÐденÑиÑикаÑÐ¾Ñ ÑооÑвеÑÑÑвÑÑÑей модели Ñ
ÑаниÑÑÑ Ð² поле. ÐÑи необÑ
одимоÑÑи полÑÑиÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑное ÑодеÑжимое ÑвÑзанного докÑменÑа, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² запÑоÑе меÑод populate(), коÑоÑÑй Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð² запÑоÑе дейÑÑвиÑелÑнÑми даннÑми.
ÐапÑимеÑ, в ÑледÑÑÑей ÑÑ
еме опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð°Ð²ÑоÑÑ Ð¸ ÑаÑÑказÑ. У каждого авÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко ÑаÑÑказов, коÑоÑÑе пÑедÑÑавим маÑÑивом ÑÑÑлок of 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 авÑоÑа ÑоÑ
ÑанÑеÑÑÑ Ð² поле "author" ÑаÑÑказа.
var bob = new Author({ name: "Bob Smith" });
bob.save(function (err) {
if (err) return handleError(err);
//авÑÐ¾Ñ Bob Ñоздан, ÑоздаÑм ÑаÑÑказ
var story = new Story({
title: "Bob goes sledding",
author: bob._id, // пÑиÑваиваем Ð¿Ð¾Ð»Ñ Ð·Ð½Ð°Ñение иденÑиÑикаÑоÑа Ðоба. ÐденÑиÑикаÑÐ¾Ñ ÑоздаÑÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ!
});
story.save(function (err) {
if (err) return handleError(err);
// У Ðоба ÑепеÑÑ ÐµÑÑÑ ÑаÑÑказ!
});
});
ТепеÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ "story" ÑÑÑлаеÑÑÑ Ð½Ð° авÑоÑа по иденÑиÑикаÑоÑÑ Ð´Ð¾ÐºÑменÑа "author". ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии об авÑоÑе пÑименÑеÑÑÑ Ð¼ÐµÑод populate() (показано ниже).
Story.findOne({ title: "Bob goes sledding" })
.populate("author") //подменÑÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð°Ð²ÑоÑа инÑоÑмаÑией об авÑоÑе!
.exec(function (err, story) {
if (err) return handleError(err);
console.log("The author is %s", story.author.name);
// вÑÐ²Ð¾Ð´Ð¸Ñ "The author is Bob Smith"
});
ÐÑимеÑание:
ÐнимаÑелÑнÑе ÑиÑаÑели замеÑили, ÑÑо авÑÐ¾Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ к ÑаÑÑказÑ, но ниÑего не Ñделано, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑаÑÑказ к маÑÑÐ¸Ð²Ñ ÑаÑÑказов stories авÑоÑа. Ðак же Ñогда полÑÑиÑÑ ÑпиÑок вÑеÑ
ÑаÑÑказов конкÑеÑного авÑоÑа? Ðдин из возможнÑÑ
ваÑианÑов - добавиÑÑ Ð°Ð²ÑоÑа в маÑÑив ÑаÑÑказов, но пÑи ÑÑом пÑиÑлоÑÑ Ð±Ñ Ñ
ÑаниÑÑ Ð´Ð°Ð½Ð½Ñе об авÑоÑаÑ
и ÑаÑÑказаÑ
в двÑÑ
меÑÑаÑ
и поддеÑживаÑÑ Ð¸Ñ
акÑÑалÑноÑÑÑ.
ÐÑÑÑе полÑÑиÑÑ _id наÑего авÑоÑа author, и пÑимениÑÑ find() Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑÑого иденÑиÑикаÑоÑа в поле "author" вÑеÑ
ÑаÑÑказов.
Story.find({ author: bob._id }).exec(function (err, stories) {
if (err) return handleError(err);
// возвÑаÑÐ°ÐµÑ Ð²Ñе ÑаÑÑказÑ, Ñ ÐºÐ¾ÑоÑÑÑ
иденÑиÑикаÑÐ¾Ñ Ðоба.
});
ÐÑо поÑÑи вÑе, ÑÑо ÑледÑÐµÑ Ð·Ð½Ð°ÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñо ÑвÑзаннÑми даннÑми в наÑем ÑÑководÑÑве. Ðолее полнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в Population (докÑменÑаÑÐ¸Ñ Mongoose).
Ðдна ÑÑ ÐµÐ¼Ð° (моделÑ) - один Ñайл
Ðожно иÑполÑзоваÑÑ Ð»ÑбÑÑ ÑÑÑÑкÑÑÑÑ Ñайлов пÑи Ñоздании ÑÑ ÐµÐ¼ и моделей, однако Ð¼Ñ Ð½Ð°ÑÑоÑÑелÑно ÑекомендÑем опÑеделÑÑÑ ÐºÐ°Ð¶Ð´ÑÑ ÑÑ ÐµÐ¼Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ в оÑделÑном модÑле (Ñайле), ÑкÑпоÑÑиÑÑÑ Ð¼ÐµÑод Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸. ÐÑÐ¸Ð¼ÐµÑ Ð¿ÑиведÑн ниже:
// Файл: ./models/somemodel.js
//ТÑебÑеÑÑÑ Mongoose
var mongoose = require("mongoose");
//ÐпÑеделÑем ÑÑ
емÑ
var Schema = mongoose.Schema;
var SomeModelSchema = new Schema({
a_string: String,
a_date: Date,
});
//ÑкÑпоÑÑиÑÑеÑÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑÐ¾Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа модели "SomeModel"
module.exports = mongoose.model("SomeModel", SomeModelSchema);
You can then require and use the model immediately in other files. Below we show how you might use it to get all instances of the model.
//СоздаÑм Ð¼Ð¾Ð´ÐµÐ»Ñ SomeModel пÑоÑÑо вÑзовом модÑÐ»Ñ Ð¸Ð· Ñайла
var SomeModel = require("../models/somemodel");
// ÐÑполÑзÑем обÑÐµÐºÑ SomeModel (моделÑ) Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка вÑеÑ
запиÑей в SomeModel
SomeModel.find(callback_function);
УÑÑановка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ MongoDB
ÐÑ Ñже немного понимаем, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÐ»Ð°ÑÑ Mongoose и как ÑледÑÐµÑ Ð¿ÑоекÑиÑоваÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸. ТепеÑÑ Ñамое вÑÐµÐ¼Ñ Ð½Ð°ÑаÑÑ ÑабоÑÑ Ð½Ð°Ð´ ÑайÑом LocalLibrary. Самое пеÑвое, ÑÑо Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑделаÑÑ - ÑÑÑановиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ MongoDb, в коÑоÑой бÑдÑÑ Ñ ÑаниÑÑÑÑ Ð´Ð°Ð½Ð½Ñе наÑей библиоÑеки.
Ð ÑÑом ÑÑководÑÑве Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² "пеÑоÑниÑе" ("sandbox") - беÑплаÑнÑй облаÑнÑй ÑеÑвиÑ, пÑедоÑÑавлÑемÑй mLab. Ð¢Ð°ÐºÐ°Ñ Ð±Ð°Ð·Ð° не оÑÐµÐ½Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¿ÑомÑÑленнÑÑ Ð²ÐµÐ±-ÑайÑов, поÑколÑÐºÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¸Ð·Ð±ÑÑоÑноÑÑи, но она оÑÐµÐ½Ñ Ñдобна Ð´Ð»Ñ ÑазÑабоÑки и пÑоÑоÑипиÑованиÑ. ÐÑ Ð¸ÑполÑзÑем еÑ, Ñак как она беÑплаÑна, ÐµÑ Ð»ÐµÐ³ÐºÐ¾ ÑÑÑановиÑÑ, и поÑÐ¾Ð¼Ñ ÑÑо mLab - попÑлÑÑнÑй поÑÑавÑик Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÐºÐ°Ðº ÑеÑвиÑа, и ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазÑмнÑм вÑбоÑом Ð´Ð»Ñ Ð¿ÑомÑÑленной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (на даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð´ÑÑгие извеÑÑнÑе возможноÑÑи вклÑÑаÑÑ Compose, ScaleGrid и MongoDB Atlas).
ÐÑимеÑание: ÐÑи желании можно ÑÑÑановиÑÑ ÐÐ MongoDb локалÑно, загÑÑзив и ÑÑÑановив Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие Ð´Ð»Ñ Ð²Ð°Ñей ÑиÑÑÐµÐ¼Ñ Ð´Ð²Ð¾Ð¸ÑнÑе ÑайлÑ. Ð ÑÑом ÑлÑÑае пÑиводимÑе ниже инÑÑÑÑкÑии не изменÑÑÑÑ, за иÑклÑÑением URL Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑй нÑжно бÑÐ´ÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð´Ð»Ñ ÑÑÑановки ÑоединениÑ.
ÐеÑвÑм делом надо ÑоздаÑÑ Ð°ÐºÐºÐ°ÑÐ½Ñ Ð½Ð° mLab (ÑÑо беÑплаÑно, ÑÑебÑÐµÑ ÑолÑко оÑновнÑÑ ÐºÐ¾Ð½ÑакÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑÑловиÑми обÑлÑживаниÑ).
ÐоÑле Ð²Ñ Ð¾Ð´Ð° в ÑиÑÑÐµÐ¼Ñ Ð²Ñ ÑвидиÑе главнÑÑ ÑÑÑаниÑÑ home:
-
ЩÑлкниÑе Create New в Ñазделе MongoDB Deployments Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÐÐ.

-
ÐÑкÑоеÑÑÑ ÑкÑан Cloud Provider Selection - Ñаздела пÑовайдеÑа облака.

- ÐÑбеÑиÑе план SANDBOX (Free) из Ñаздела Plan Type (Ñип плана).
- ÐÑбеÑиÑе лÑбого пÑовайдеÑа в Ñазделе Cloud Provider (пÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ð¾Ð±Ð»Ð°ÐºÐ°). РазнÑе пÑовайдеÑÑ Ð¾Ð±ÑлÑживаÑÑ ÑазнÑе ÑÐµÐ³Ð¸Ð¾Ð½Ñ (Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¿Ð¾Ð´ вÑбÑаннÑм Ñипом плана).
- ЩÑлкниÑе ÐºÐ½Ð¾Ð¿ÐºÑ Continue.
-
ÐÑкÑоеÑÑÑ ÑкÑан вÑбоÑа Ñегиона Select Region.

- ÐÑбеÑиÑе ближайÑий к вам Ñегион и ÑÑлкниÑе ÐºÐ½Ð¾Ð¿ÐºÑ Continue.
-
ÐÑкÑоеÑÑÑ ÑкÑан Final Details Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐÐ.
- ÐведиÑе Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ð±Ð°Ð·Ñ -
local_libraryи нажмиÑе Continue.
- ÐведиÑе Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ð±Ð°Ð·Ñ -
-
ÐÑкÑоеÑÑÑ ÑкÑан подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ°Ð·Ð° Order Confirmation.

- ЩÑлкниÑе Submit Order (подÑвеÑдиÑÑ Ð·Ð°ÐºÐ°Ð·), ÑÑÐ¾Ð±Ñ ÑоздаÑÑ ÐÐ.
-
ÐÑ Ð²ÐµÑнÑÑеÑÑ Ð½Ð° главнÑй (home) ÑкÑан. ЩÑлкниÑе по Ð²Ð½Ð¾Ð²Ñ Ñозданной базе, ÑÑÐ¾Ð±Ñ Ð¾ÑкÑÑÑÑ ÑкÑан Ñ Ð´ÐµÑалÑной инÑоÑмаÑией. Ðак видно, в ÐÐ Ð½ÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑий (даннÑÑ ).

Ðа ÑоÑме вÑÑе обведÑн URL Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð°Ñей ÐÐthat you need to use to access your database is displayed on the form above (shown for this database circled above). ЧÑÐ¾Ð±Ñ ÐµÐ³Ð¾ иÑполÑзоваÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÐÐ, коÑоÑÑй позже введÑÑ ÑÑÐ¾Ñ URL.
-
ЩÑлкниÑе по вкладке Users и вÑбеÑиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Add database user (добавиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÐÐ).
-
ÐведиÑе Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ паÑÐ¾Ð»Ñ (дваждÑ), заÑем нажмиÑе Create (ÑоздаÑÑ). Ðе оÑмеÑайÑе Make read only (ÑолÑко Ð´Ð»Ñ ÑÑениÑ)!

ТепеÑÑ ÐÐ Ñоздана, и Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ней еÑÑÑ URL, Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ паÑолÑ. ÐÑо должно вÑглÑдеÑÑ Ð¿ÑимеÑно Ñак: mongodb://your_user_namer:your_password@ds119748.mlab.com:19748/local_library.
УÑÑановка Mongoose
ÐÑкÑойÑе окно команд и пеÑейдиÑе в каÑалог, в коÑоÑом Ñоздан каÑÐºÐ°Ñ Ð²ÐµÐ±-ÑайÑа Local Library. ÐведиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ install, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ Mongoose (и ÐµÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи), а Ñакже добавÑÑе ÐµÑ Ð² Ñайл package.json, еÑли Ð²Ñ ÐµÑÑ Ð½Ðµ Ñделали ÑÑого Ñанее, пÑи ÑÑении УÑебника по Mongoose.
npm install mongoose
ÐодклÑÑение к MongoDB
ÐÑкÑойÑе /app.js (в коÑне пÑоекÑа) и ÑкопиÑÑйÑе пÑиведÑннÑй ниже ÑекÑÑ, в коÑоÑом обÑÑвлÑеÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Express (поÑле ÑÑÑоки var app = express();). ÐамениÑе ÑÑÑÐ¾ÐºÑ url ÐÐ ('insert_your_database_url_here') Ñем URL, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ð²Ð°ÑÑ ÐÐ (Ñ.е. иÑполÑзÑйÑе инÑоÑмаÑиÑ, полÑÑеннÑÑ Ð¾Ñ mLab).
//УÑÑанавливаем Ñоединение Ñ mongoose
var mongoose = require("mongoose");
var mongoDB = "insert_your_database_url_here"; //замениÑе url!!!
mongoose.connect(mongoDB);
mongoose.Promise = global.Promise;
var db = mongoose.connection;
db.on("error", console.error.bind(console, "MongoDB connection error:"));
Ðак Ñказано Ñанее в УÑебнике по Mongoose, ÑÑÐ¾Ñ ÐºÐ¾Ð´ задаÑÑ Ñоединение по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð¿ÑивÑзкой ÑобÑÑÐ¸Ñ Ð¾Ñибки error (Ñак ÑÑо оÑибки бÑдÑÑ Ð²ÑÐ²ÐµÐ´ÐµÐ½Ñ Ð² конÑолÑ).
ÐпÑеделение ÑÑ ÐµÐ¼Ñ LocalLibrary
ÐÑ Ð¾Ð¿Ñеделим оÑделÑнÑй модÑÐ»Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ модели как Ñже обÑÑждалоÑÑ Ð²ÑÑе. ÐаÑнÑм Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ°Ñалога Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ в коÑне пÑоекÑа (/models), поÑле Ñего Ñоздадим оÑделÑнÑе ÑÐ°Ð¹Ð»Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ модели:
/express-locallibrary-tutorial //the project root
/models
author.js
book.js
bookinstance.js
genre.js
ÐÐ¾Ð´ÐµÐ»Ñ Ð°Ð²ÑоÑа Author
СкопиÑÑйÑе код ÑÑ
ÐµÐ¼Ñ Ð°Ð²ÑоÑа Author (пÑиведÑн ниже) в Ñайл ./models/author.js . Ð ÑÑ
еме опÑеделено, ÑÑо Ñ Ð°Ð²ÑоÑа еÑÑÑ Ð¾Ð±ÑзаÑелÑнÑе Ð¿Ð¾Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ и Ñамилии Ñипа String длиной не более 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 },
});
// ÐиÑÑÑалÑное ÑвойÑÑво Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ имени авÑоÑа
AuthorSchema.virtual("name").get(function () {
return this.family_name + ", " + this.first_name;
});
// ÐиÑÑÑалÑное ÑвойÑÑво - 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
СкопиÑÑйÑе код ÑÑ
ÐµÐ¼Ñ Book (пÑиведÑн ниже) в Ñайл ./models/book.js. ÐолÑÑÐ°Ñ ÑаÑÑÑ ÐºÐ¾Ð´Ð° подобна ÐºÐ¾Ð´Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ авÑоÑа â обÑÑвлÑеÑÑÑ ÑÑ
ема Ñ ÑÑдом ÑÑÑоковÑÑ
полей, Ñ Ð²Ð¸ÑÑÑалÑнÑм ÑвойÑÑвом URL Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ URL конкÑеÑнÑÑ
книг, заÑем Ð¼Ð¾Ð´ÐµÐ»Ñ ÑкÑпоÑÑиÑÑеÑÑÑ.
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var BookSchema = new Schema({
title: { type: String, required: true },
author: { type: Schema.ObjectId, ref: "Author", required: true },
summary: { type: String, required: true },
isbn: { type: String, required: true },
genre: [{ type: Schema.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 - ÑÑо ÑÑÑлка на единÑÑвеннÑй обÑÐµÐºÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸
Author, обÑзаÑелÑнÑй ÑлеменÑ. - genre (жанÑ) - ÑÑÑлка на маÑÑив обÑекÑов модели
Genre. ÐÑа Ð¼Ð¾Ð´ÐµÐ»Ñ ÐµÑÑ Ð½Ðµ обÑÑвлена!
ÐÐ¾Ð´ÐµÐ»Ñ ÑкземплÑÑа книги BookInstance
ÐаконеÑ, ÑкопиÑÑйÑе код ÑÑ
ÐµÐ¼Ñ BookInstance (пÑиведÑн ниже) в Ñайл ./models/bookinstance.js. СÑ
ема BookInstance пÑедÑÑавлÑÐµÑ ÐºÐ¾Ð½ÐºÑеÑнÑй ÑкземплÑÑ ÐºÐ½Ð¸Ð³Ð¸, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ одолжиÑÑ Ð½Ð° вÑемÑ, и ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ доÑÑÑпноÑÑи ÑкземплÑÑов книги, о даÑе возвÑаÑа одолженной книги, о деÑалÑÑ
веÑÑии или пеÑаÑного ÑкземплÑÑа.
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var BookInstanceSchema = new Schema({
book: { type: Schema.ObjectId, ref: "Book", required: true }, //ÑÑÑлка на книгÑ
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: ÐозволÑÐµÑ ÑказаÑÑ Ð´Ð¾Ð¿ÑÑÑимÑе знаÑÐµÐ½Ð¸Ñ ÑÑÑоки. РнаÑем ÑлÑÑае иÑполÑзÑÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ ÑÑаÑÑÑ Ð´Ð¾ÑÑÑпноÑÑи книги (пÑименение enum (пеÑеÑиÑлениÑ) ознаÑаеÑ, ÑÑо Ð¼Ñ Ñ Ð¾Ð´Ð¸Ð¼ пÑедоÑвÑаÑиÑÑ Ð¾ÑибоÑное напиÑание и пÑоизволÑнÑе знаÑÐµÐ½Ð¸Ñ ÑÑаÑÑÑа)default: опÑеделÑÐµÑ Ð·Ð½Ð°Ñение ÑÑаÑÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ (maintenance) пÑи Ñоздании ÑкземплÑÑа книги, и даÑÑdue_backвозвÑаÑа книги (now,ÑейÑаÑ). ÐÑмеÑÑÑе, как иÑполÑзÑеÑÑÑ ÑÑнкÑÐ¸Ñ Date пÑи ÑÑÑановке даÑÑ!
ÐÑе оÑÑалÑное знакомо по пÑедÑдÑÑим ÑÑ ÐµÐ¼Ð°Ð¼.
ÐÐ¾Ð´ÐµÐ»Ñ Ð¶Ð°Ð½Ñа Genre - пÑовеÑÑÑе ÑебÑ!
ÐÑкÑойÑе Ñайл ./models/genre.js и ÑоздайÑе ÑÑ ÐµÐ¼Ñ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¶Ð°Ð½Ñа (каÑегоÑии книги, Ñ.е. Ñ ÑдожеÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ наÑÑнаÑ, ÑоманÑика или Ð²Ð¾ÐµÐ½Ð½Ð°Ñ Ð¸ÑÑоÑÐ¸Ñ Ð¸ Ñ.д.).
ÐпÑеделение бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ дÑÑгим моделÑм:
- Рмодели должно бÑÑÑ Ð¿Ð¾Ð»Ðµ
nameÑипаStringÐ´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¶Ð°Ð½Ñа. - ÐÑо поле должно бÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм, допÑÑÑимÑй ÑÐ°Ð·Ð¼ÐµÑ - Ð¾Ñ 3 до 100 Ñимволов.
- ÐбÑÑвиÑе виÑÑÑалÑное (virtual) ÑвойÑÑво Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
urlÐ´Ð»Ñ URL жанÑа. - ÐкÑпоÑÑиÑÑйÑе моделÑ.
ТеÑÑиÑование â ÑоздаÑм ÑлеменÑÑ ÐÐ
ÐÐ¾Ñ Ñак. У Ð½Ð°Ñ ÑепеÑÑ ÐµÑÑÑ Ð²Ñе модели Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑайÑа!
ÐÐ»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ (и Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑимеÑов книг и дÑÑÐ³Ð¸Ñ ÑлеменÑов, коÑоÑÑе поÑÑебÑÑÑÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÑÑаÑÑÑÑ ) вÑполним незавиÑимÑй ÑкÑипÑ, коÑоÑÑй ÑоздаÑÑ ÑлеменÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа:
-
ÐагÑÑзиÑе (или ÑоздайÑе) Ñайл populatedb.js в каÑалоге express-locallibrary-tutorial (на Ñом же ÑÑовне, ÑÑо и
package.json).ÐÑимеÑание: Ðе обÑзаÑелÑно понимаÑÑ, как ÑабоÑÐ°ÐµÑ populatedb.js; он пÑоÑÑо помеÑÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе даннÑе в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
-
ÐведиÑе в коÑне пÑоекÑа ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð»Ñ ÑÑÑановки модÑÐ»Ñ async, коÑоÑÑй поÑÑебÑеÑÑÑ ÑкÑипÑÑ populatedb.js (ÑÐ¾Ð»Ñ async обÑÑдим в ÑледÑÑÑÐ¸Ñ ÑÑководÑÑÐ²Ð°Ñ )
bashnpm install async -
ÐапÑÑÑиÑе ÑкÑÐ¸Ð¿Ñ Ð¸Ð· командной ÑÑÑоки, иÑполÑзÑÑ node. РкаÑеÑÑве паÑамеÑÑа ÑкажиÑе URL ваÑей ÐÐ MongoDB (ÑÐ¾Ñ ÑамÑй, коÑоÑÑм Ð²Ñ Ñанее заменили insert_your_database_url_here в Ñайле
app.js):bashnode populatedb <your mongodb url> -
СкÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑполниÑÑÑÑ Ð´Ð¾ конÑа, вÑÐ²Ð¾Ð´Ñ Ð² ÑеÑминал ÑоздаваемÑе ÑлеменÑÑ.
ÐÑимеÑание: ÐÑкÑойÑе ÑÐ²Ð¾Ñ Ð±Ð°Ð·Ñ Ð½Ð° Lab. ÐÑ ÑможеÑе ÑвидеÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑии Book, Author, Genre, BookInstance (книги, авÑоÑÑ, жанÑÑ, ÑкземплÑÑÑ ÐºÐ½Ð¸Ð³) и пÑоÑмоÑÑеÑÑ ÑодеÑжаÑиеÑÑ Ð² Ð½Ð¸Ñ Ð´Ð¾ÐºÑменÑÑ.
ÐÑог
Ð ÑÑой ÑÑаÑÑе Ð¼Ñ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð»Ð¸ÑÑ Ñ ÐРи ÐÐ Ð (обÑекÑно-ÑелÑÑионнÑми моделÑми) в ÑиÑÑеме Node/Express, Ñзнали, как опÑеделÑÑÑÑÑ ÑÑ
ÐµÐ¼Ñ Ð¸ модели Mongoose. ÐÑ Ð¿Ñименили ÑÑи Ð·Ð½Ð°Ð½Ð¸Ñ Ð¿Ñи пÑоекÑиÑовании и ÑеализаÑии моделей Book, BookInstance, Author и Genre Ð´Ð»Ñ Ð²ÐµÐ±-ÑайÑа LocalLibrary.
РконÑе Ð¼Ñ Ð¸ÑпÑÑали Ñвои модели пÑÑÑм ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑда ÑлеменÑов (пÑи помоÑи авÑономного ÑкÑипÑа). Ð ÑледÑÑÑей ÑÑаÑÑе Ð¼Ñ ÑаÑÑмоÑÑим Ñоздание ÑÑÑаниÑ, на коÑоÑÑÑ Ð±ÑдÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑи ÑлеменÑÑ.
СмоÑÑиÑе Ñакже
- Database integration ÐнÑегÑаÑÐ¸Ñ ÐÐ (докÑменÑаÑÐ¸Ñ Express)
- Mongoose website Ðеб-ÑÐ°Ð¹Ñ Mongoose (докÑменÑаÑÐ¸Ñ Mongoose)
- Mongoose Guide СпÑавоÑник Mongoose (докÑменÑаÑÐ¸Ñ Mongoose)
- Validation ÐалидаÑÐ¸Ñ (докÑменÑаÑÐ¸Ñ Mongoose)
- Schema Types Ð¢Ð¸Ð¿Ñ Ð² ÑÑ ÐµÐ¼Ð°Ñ (докÑменÑаÑÐ¸Ñ Mongoose)
- Models Ðодели (докÑменÑаÑÐ¸Ñ Mongoose)
- Queries ÐапÑоÑÑ (докÑменÑаÑÐ¸Ñ Mongoose)
- Population Ðополнение ÐÐ (докÑменÑаÑÐ¸Ñ Mongoose)
In this module
- Express/Node introduction
- Setting up a Node (Express) development environment
- Express Tutorial: The Local Library website
- Express Tutorial Part 2: Creating a skeleton website
- Express Tutorial Part 3: Using a Database (with Mongoose)
- Express Tutorial Part 4: Routes and controllers
- Express Tutorial Part 5: Displaying library data
- Express Tutorial Part 6: Working with forms
- Express Tutorial Part 7: Deploying to production