mongodb簡(jiǎn)介
在使用nodejs時(shí)候施掏,需要存儲(chǔ)一些簡(jiǎn)單json數(shù)據(jù)的情況下椿争,很多人會(huì)推薦使用mongodb硼莽。mongodb是一個(gè)文檔型數(shù)據(jù)庫(kù)倍奢,在 sql 中朴上,數(shù)據(jù)層級(jí)是:數(shù)據(jù)庫(kù)(db) -> 表(table) -> 記錄(record)-> 字段;在 mongodb 中娱挨,數(shù)據(jù)的層級(jí)是:數(shù)據(jù)庫(kù) -> collection -> document -> 字段余指。其他更多詳細(xì)的概念可以去官網(wǎng)等地方查詢,我的主要目的是結(jié)合nodejs盡快用起來(lái)跷坝。
mongodb使用準(zhǔn)備
nodejs的安裝就不再介紹了酵镜。
-
mongodb的安裝在mac上推薦使用brew:
brew install mongodb
安裝好以后在在命令行窗口輸入mongod,就可以啟動(dòng)mongodb柴钻,然后新開(kāi)一個(gè)shell窗口淮韭,輸入mongo,就可以使用shell命令來(lái)創(chuàng)建操作數(shù)據(jù)庫(kù)贴届,具體命令都可以在官網(wǎng)找到靠粪,熟悉一些基本的命令show、use毫蚓、find等就可以了占键。下面我們主要在nodejs中使用moogoose來(lái)操作數(shù)據(jù)庫(kù)。
moogoose使用簡(jiǎn)介
moogoose是一個(gè)odm元潘,object-document mapping,對(duì)象文檔映射畔乙。它的作用就是,在程序代碼中翩概,定義一下數(shù)據(jù)庫(kù)中的數(shù)據(jù)格式牲距,然后取數(shù)據(jù)時(shí)通過(guò)它們,可以把數(shù)據(jù)庫(kù)中的 document 映射成程序中的一個(gè)對(duì)象钥庇,這個(gè)對(duì)象有 .save .update 等一系列方法牍鞠,和 .title .author 等一系列屬性。在調(diào)用這些方法時(shí)评姨,odm 會(huì)根據(jù)你調(diào)用時(shí)所用的條件难述,自動(dòng)轉(zhuǎn)換成相應(yīng)的 mongodb shell 語(yǔ)句幫你發(fā)送出去。自然地,在程序中鏈?zhǔn)秸{(diào)用一個(gè)個(gè)的方法要比手寫數(shù)據(jù)庫(kù)操作語(yǔ)句具有更大的靈活性和便利性龄广。在nodejs中使用moogoose有一個(gè)簡(jiǎn)單的demo:
// 首先引入 mongoose 這個(gè)模塊
var mongoose = require('mongoose');
// 然后連接對(duì)應(yīng)的數(shù)據(jù)庫(kù):mongodb://localhost/test
// 其中硫眯,前面那個(gè) mongodb 是 protocol scheme 的名稱;localhost 是 mongod 所在的地址择同;
// 端口號(hào)省略則默認(rèn)連接 27017两入;test 是數(shù)據(jù)庫(kù)的名稱
// mongodb 中不需要建立數(shù)據(jù)庫(kù),當(dāng)你需要連接的數(shù)據(jù)庫(kù)不存在時(shí)敲才,會(huì)自動(dòng)創(chuàng)建一個(gè)出來(lái)裹纳。
mongoose.connect('mongodb://localhost/test');
// 上面說(shuō)了,我推薦在同一個(gè) collection 中使用固定的數(shù)據(jù)形式紧武。
// 在這里剃氧,我們創(chuàng)建了一個(gè)名為 Cat 的 model,它在數(shù)據(jù)庫(kù)中的名字根據(jù)傳給 mongoose.model 的第一個(gè)參數(shù)決定阻星,mongoose 會(huì)將名詞變?yōu)閺?fù)數(shù)朋鞍,在這里,collection 的名字會(huì)是 `cats`妥箕。
// 這個(gè) model 的定義是滥酥,有一個(gè) String 類型的 name,String 數(shù)組類型的 friends畦幢,Number 類型的 age坎吻。
// mongodb 中大多數(shù)的數(shù)據(jù)類型都可以用 js 的原生類型來(lái)表示。至于說(shuō) String 的長(zhǎng)度是多少宇葱,Number 的精度是多少瘦真。String 的最大限度是 16MB,Number 的整型是 64-bit黍瞧,浮點(diǎn)數(shù)的話诸尽,js 中 `0.1 + 0.2` 的結(jié)果都是亂來(lái)的。印颤。就不指望什么了您机。。
// 這里可以看到各種示例:http://mongoosejs.com/docs/schematypes.html
var Cat = mongoose.model('Cat', {
name: String,
friends: [String],
age: Number,
});
// new 一個(gè)新對(duì)象膀哲,名叫 kitty
// 接著為 kitty 的屬性們賦值
var kitty = new Cat({ name: 'Zildjian', friends: ['tom', 'jerry']});
kitty.age = 3;
// 調(diào)用 .save 方法后往产,mongoose 會(huì)去你的 mongodb 中的 test 數(shù)據(jù)庫(kù)里被碗,存入一條記錄某宪。
kitty.save(function (err) {
if (err) // ...
console.log('meow');
});
moogoose中三個(gè)基本概念
上面的demo就可以簡(jiǎn)單使用起來(lái)mongodb存儲(chǔ)一條記錄,但是對(duì)于mongodb三個(gè)最基本的概念Schema, Model, Entity并未涉及太多锐朴。在項(xiàng)目應(yīng)用時(shí)候兴喂,需要嚴(yán)格的劃分定義。
-
Schema
一種以文件形式存儲(chǔ)的數(shù)據(jù)庫(kù)模型骨架,不具備數(shù)據(jù)庫(kù)的操作能力衣迷,僅僅是定義數(shù)據(jù)屬性的一個(gè)模型畏鼓。在Schema中可以定義方法,一個(gè)簡(jiǎn)單的例子如下:
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發(fā)布生成的模型壶谒,具有抽象屬性和行為的數(shù)據(jù)庫(kù)操作對(duì)云矫。可以認(rèn)為是一個(gè)管理數(shù)據(jù)庫(kù)屬性汗菜、行為的類让禀。具體例子如下:
var Movie=mongoose.model('Movie', MovieSchema);
-
Entity
由Model創(chuàng)建的實(shí)體,他的操作也會(huì)影響數(shù)據(jù)庫(kù)陨界。他的方法和Model上操作的方法有些區(qū)別巡揍,比如新增是save,而model上是create菌瘪。項(xiàng)目中使用的一個(gè)片段如下:
_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在數(shù)據(jù)庫(kù)中新增了一條記錄。
總結(jié)
本文簡(jiǎn)單介紹了一下mongodb和mongoose的基本使用俏扩,就可以在項(xiàng)目中簡(jiǎn)單的使用起來(lái)糜工,關(guān)于其中的更具體的用法和一些區(qū)別,需要進(jìn)一步探索和使用动猬。
參考資料
主要參考了以下兩篇文章啤斗,引用了其中一些定義和一個(gè)demo。