mongodb使用簡(jiǎn)介

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。

1.mongodb簡(jiǎn)介
2.mongoose簡(jiǎn)介

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赁咙,一起剝皮案震驚了整個(gè)濱河市钮莲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彼水,老刑警劉巖崔拥,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凤覆,居然都是意外死亡链瓦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門盯桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慈俯,“玉大人,你說(shuō)我怎么就攤上這事拥峦√欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵略号,是天一觀的道長(zhǎng)刑峡。 經(jīng)常有香客問(wèn)我洋闽,道長(zhǎng),這世上最難降的妖魔是什么突梦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任诫舅,我火速辦了婚禮,結(jié)果婚禮上宫患,老公的妹妹穿的比我還像新娘刊懈。我一直安慰自己,他們只是感情好娃闲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布俏讹。 她就那樣靜靜地躺著,像睡著了一般畜吊。 火紅的嫁衣襯著肌膚如雪泽疆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天玲献,我揣著相機(jī)與錄音殉疼,去河邊找鬼。 笑死捌年,一個(gè)胖子當(dāng)著我的面吹牛瓢娜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼预,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼眠砾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了托酸?” 一聲冷哼從身側(cè)響起褒颈,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎励堡,沒(méi)想到半個(gè)月后谷丸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡应结,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年刨疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹅龄。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揩慕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扮休,到底是詐尸還是另有隱情迎卤,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布肛炮,位于F島的核電站止吐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侨糟。R本人自食惡果不足惜碍扔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秕重。 院中可真熱鬧不同,春花似錦、人聲如沸溶耘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凳兵。三九已至百新,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庐扫,已是汗流浹背饭望。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留形庭,地道東北人铅辞。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像斟珊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子富纸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容