1. Mở đầu:
MongoDB là một trong những cơ sở dữ liệu mã nguồn mở NoSQL phổ biến nhất được biết bằng C++. Tính đến tháng 2/2015, MongoDB được xếp thứ 4 trong số các hệ thống cơ sở dữ liệu phổ biến nhất. Nó được pahts triển bởi công ty 10gen sau này được biết đến với tên MongoDB Inc.
MongoDB là cơ sở dữ liệu hướng tài liệu, nó lưu trữ dữ liệu trong các document dạng JSON với schema động rất linh hoạt. Nghĩa là bạn có thể lưu các bản ghi mà không cần lo lắng về cấu trúc dữ liệu như là số trường, kiểu của trường lưu trữ. Tài liệu MongoDB tương tự như các đối tượng JSON.
Trong MongoDB, dữ liệu được lưu trữ như một document, một tập của các cặp key-value. Bạn có thể định nghĩa nhiều database trong MongoDB và mỗi database có nhiều collections, những collections này đơn giản là tập của các documents được lưu trữ dạng cặp key-value.
2. Kết nối với MongoDB:
- Cài đặt Mongoose
- Cài đặt mongodb
- Thiết lập mongod nếu bạn chưa biết (đọc bài này)
- Đảm bảo mongodb đang chạy cùng với server localhost
3. Tạo một schema :
MongoDB là một document database, nó lưu trữ JSON như các object. Model/schema mô tả cái mà các đối tượng này chứa.
schema lên mô tả các trường chúng ta có trong form và chỉ định dữ liệu nó mong đợi
Ví dụ 1 model như sau :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">var</span> mongoose <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'mongoose'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> uniqueValidator <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'mongoose-unique-validator'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> UserSchema <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">mongoose<span class="token punctuation">.</span>Schema</span><span class="token punctuation">(</span><span class="token punctuation">{</span> username<span class="token punctuation">:</span> <span class="token punctuation">{</span>type<span class="token punctuation">:</span> String<span class="token punctuation">,</span> unique<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> index<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> required<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"can't be blank"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> match<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token regex">/^[a-zA-Z0-9]+$/</span><span class="token punctuation">,</span> <span class="token string">'is invalid'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> minlength<span class="token punctuation">:</span><span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token string">"username more than 6 degits"</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token punctuation">{</span>type<span class="token punctuation">:</span> String<span class="token punctuation">,</span> lowercase<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> unique<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> required<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">"can't be blank"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> match<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token regex">/<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>S+.S+/</span><span class="token punctuation">,</span> <span class="token string">'is invalid'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> index<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">,</span> sex<span class="token punctuation">:</span> String<span class="token punctuation">,</span> firstName<span class="token punctuation">:</span> String<span class="token punctuation">,</span> lastName<span class="token punctuation">:</span> String<span class="token punctuation">,</span> birthday<span class="token punctuation">:</span> Date<span class="token punctuation">,</span> image<span class="token punctuation">:</span> String<span class="token punctuation">,</span> isDelete<span class="token punctuation">:</span> Boolean<span class="token punctuation">,</span> createBy<span class="token punctuation">:</span> String<span class="token punctuation">,</span> updateBy<span class="token punctuation">:</span> String<span class="token punctuation">,</span> hash<span class="token punctuation">:</span> String<span class="token punctuation">,</span> salt<span class="token punctuation">:</span> String<span class="token punctuation">,</span> notes<span class="token punctuation">:</span> String <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>timestamps<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> UserSchema<span class="token punctuation">.</span><span class="token function">plugin</span><span class="token punctuation">(</span>uniqueValidator<span class="token punctuation">,</span> <span class="token punctuation">{</span>message<span class="token punctuation">:</span> <span class="token string">'is already taken.'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mongoose<span class="token punctuation">.</span><span class="token function">model</span><span class="token punctuation">(</span><span class="token string">'User'</span><span class="token punctuation">,</span> UserSchema<span class="token punctuation">)</span><span class="token punctuation">;</span> |
Ở đây chúng ta có thể quy định các validation cho các dữ liệu của model, như các bạn thấy ở usernam tôi đã quy định cho nó là required, chỉ được phép chữ và số, và minlength phải là 6 kí tự chẳng hạn
4.Insert dữ liệu vào MongoDB:
- Thêm middleware body-parser để parse body của các request đến server
- Tạo POST route cho việc gửi dữ liệu tới server
- Lưu trữ các giá trị được điền vào form và lưu trữ vào db với schema
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">let</span> <span class="token function-variable function">registerUser</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>user<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> newUser <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">dbUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> encryptResult <span class="token operator">=</span> <span class="token function">encryptPassword</span><span class="token punctuation">(</span>user<span class="token punctuation">.</span>password<span class="token punctuation">)</span><span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>username <span class="token operator">=</span> user<span class="token punctuation">.</span>username<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>email <span class="token operator">=</span> user<span class="token punctuation">.</span>email<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>sex <span class="token operator">=</span> <span class="token constant">CONSTANTS</span><span class="token punctuation">.</span><span class="token constant">SEX</span><span class="token punctuation">.</span><span class="token constant">MALE</span><span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>firstName <span class="token operator">=</span> user<span class="token punctuation">.</span>firstName<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>lastName <span class="token operator">=</span> user<span class="token punctuation">.</span>lastName<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>birthday <span class="token operator">=</span> user<span class="token punctuation">.</span>birthday<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>image <span class="token operator">=</span> user<span class="token punctuation">.</span>image<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>notes <span class="token operator">=</span> user<span class="token punctuation">.</span>notes<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>isDelete <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>createBy <span class="token operator">=</span> user<span class="token punctuation">.</span>createBy<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>updateBy <span class="token operator">=</span> user<span class="token punctuation">.</span>updateBy<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>salt <span class="token operator">=</span> encryptResult<span class="token punctuation">.</span>salt<span class="token punctuation">;</span> newUser<span class="token punctuation">.</span>hash <span class="token operator">=</span> encryptResult<span class="token punctuation">.</span>hash<span class="token punctuation">;</span> <span class="token keyword">return</span> newUser<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
5. Select dữ liệu từ MongoDB :
1 2 3 4 | <span class="token keyword">let</span> <span class="token function-variable function">getUserById</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> dbUser<span class="token punctuation">.</span><span class="token function">findById</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
6. Update dữ liệu MongoDB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <span class="token keyword">let</span> <span class="token function-variable function">updateUser</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>req<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> dbUser<span class="token punctuation">.</span><span class="token function">findById</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>payload<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span>user<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// only update fields that were actually passed...</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>username <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>username <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>username<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>email <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>email <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>email<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>sex <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>sex <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>sex<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>firstName <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>firstName <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>firstName<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>lastName <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>lastName <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>lastName<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>birthday <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>birthday <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>birthday<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>isDelete <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>isDelete <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>isDelete<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>notes <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>notes <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>notes<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>image <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> user<span class="token punctuation">.</span>image <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>image<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">typeof</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>password <span class="token operator">!==</span> <span class="token string">'undefined'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> encryptResult <span class="token operator">=</span> <span class="token function">encryptPassword</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>user<span class="token punctuation">.</span>password<span class="token punctuation">)</span><span class="token punctuation">;</span> user<span class="token punctuation">.</span>salt <span class="token operator">=</span> encryptResult<span class="token punctuation">.</span>salt<span class="token punctuation">;</span> user<span class="token punctuation">.</span>hash <span class="token operator">=</span> encryptResult<span class="token punctuation">.</span>hash<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> user<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |