在使用nodejs時候,須要存儲一些簡單json數據的狀況下,不少人會推薦使用mongodb。mongodb是一個文檔型數據庫,在 sql 中,數據層級是:數據庫(db) -> 表(table) -> 記錄(record)-> 字段;在 mongodb 中,數據的層級是:數據庫 -> collection -> document -> 字段。其餘更多詳細的概念能夠去官網等地方查詢,個人主要目的是結合nodejs儘快用起來。html
mongodb的安裝在mac上推薦使用brew:node
brew install mongodb
安裝好之後在在命令行窗口輸入mongod,就能夠啓動mongodb,而後新開一個shell窗口,輸入mongo,就可使用shell命令來建立操做數據庫,具體命令均可以在官網找到,熟悉一些基本的命令show、use、find等就能夠了。下面咱們主要在nodejs中使用moogoose來操做數據庫。sql
moogoose是一個odm,object-document mapping,對象文檔映射。它的做用就是,在程序代碼中,定義一下數據庫中的數據格式,而後取數據時經過它們,能夠把數據庫中的 document 映射成程序中的一個對象,這個對象有 .save .update 等一系列方法,和 .title .author 等一系列屬性。在調用這些方法時,odm 會根據你調用時所用的條件,自動轉換成相應的 mongodb shell 語句幫你發送出去。天然地,在程序中鏈式調用一個個的方法要比手寫數據庫操做語句具備更大的靈活性和便利性。在nodejs中使用moogoose有一個簡單的demo:mongodb
// 首先引入 mongoose 這個模塊 var mongoose = require('mongoose'); // 而後鏈接對應的數據庫:mongodb://localhost/test // 其中,前面那個 mongodb 是 protocol scheme 的名稱;localhost 是 mongod 所在的地址; // 端口號省略則默認鏈接 27017;test 是數據庫的名稱 // mongodb 中不須要創建數據庫,當你須要鏈接的數據庫不存在時,會自動建立一個出來。 mongoose.connect('mongodb://localhost/test'); // 上面說了,我推薦在同一個 collection 中使用固定的數據形式。 // 在這裏,咱們建立了一個名爲 Cat 的 model,它在數據庫中的名字根據傳給 mongoose.model 的第一個參數決定,mongoose 會將名詞變爲複數,在這裏,collection 的名字會是 `cats`。 // 這個 model 的定義是,有一個 String 類型的 name,String 數組類型的 friends,Number 類型的 age。 // mongodb 中大多數的數據類型均可以用 js 的原生類型來表示。至於說 String 的長度是多少,Number 的精度是多少。String 的最大限度是 16MB,Number 的整型是 64-bit,浮點數的話,js 中 `0.1 + 0.2` 的結果都是亂來的。。就不期望什麼了。。 // 這裏能夠看到各類示例:http://mongoosejs.com/docs/schematypes.html var Cat = mongoose.model('Cat', { name: String, friends: [String], age: Number, }); // new 一個新對象,名叫 kitty // 接着爲 kitty 的屬性們賦值 var kitty = new Cat({ name: 'Zildjian', friends: ['tom', 'jerry']}); kitty.age = 3; // 調用 .save 方法後,mongoose 會去你的 mongodb 中的 test 數據庫裏,存入一條記錄。 kitty.save(function (err) { if (err) // ... console.log('meow'); });
上面的demo就能夠簡單使用起來mongodb存儲一條記錄,可是對於mongodb三個最基本的概念Schema, Model, Entity並未涉及太多。在項目應用時候,須要嚴格的劃分定義。shell
Schema數據庫
一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力,僅僅是定義數據屬性的一個模型。在Schema中能夠定義方法,一個簡單的例子以下:json
var mongoose = require('mongoose'); var MovieSchema = new mongoose.Schema({ doctor: String, title: String, language: String, country: String, year: String, summary: String, poster: String, meta: { createAt: { type: Date, default: Date.now() }, updateAt: { type: Date, default: Date.now() } } }); MovieSchema.statics = { fetch: function (cb) { return this .find({}) .sort('meta.updateAt') .exec(cb); }, findById: function (id, cb) { return this .findOne({_id: id}) .exec(cb); } };
Model數組
由Schema發佈生成的模型,具備抽象屬性和行爲的數據庫操做對。能夠認爲是一個管理數據庫屬性、行爲的類。具體例子以下:app
var Movie=mongoose.model('Movie', MovieSchema);
Entityless
由Model建立的實體,他的操做也會影響數據庫。他的方法和Model上操做的方法有些區別,好比新增是save,而model上是create。項目中使用的一個片斷以下:
_movie = new Movie({ doctor: movieObj.doctor, title: movieObj.title, language: movieObj.language, country: movieObj.country, year: movieObj.year, poster: movieObj.poster, flash: movieObj.flash, summary: movieObj.summary }); _movie.save(function(err, movie) { if (err) { console.log(err); } res.redirect('/movie/' + movie._id); });
其中_movie就是Entity,利用.save在數據庫中新增了一條記錄。
本文簡單介紹了一下mongodb和mongoose的基本使用,就能夠在項目中簡單的使用起來,關於其中的更具體的用法和一些區別,須要進一步探索和使用。
主要參考瞭如下兩篇文章,引用了其中一些定義和一個demo。
1.mongodb簡介
2.mongoose簡介