MongoDB

MongoDB可視化操作軟件钳宪,是使用圖形界面操作數(shù)據(jù)庫的一種方式。

數(shù)據(jù)庫相關(guān)概念

Mongoose第三方包

使用Node.js操作MongoDB數(shù)據(jù)庫需要依賴Node.js第三方包mongoose

使用npm install mongoose 命令下載寨辩。

啟動MongoDB-

在命令行工具中運行net start mongoDB 即可啟動MongoDB,否則MongoDB將無法連接。

數(shù)據(jù)庫連接-

使用mongoose提供的connect方法即可連接數(shù)據(jù)庫歼冰。

mongoose.connect('mongodb://localhost/playground')

? ? ? ? ? ? .then( () => console.log('數(shù)據(jù)庫連接成功'))

? ? ? ? ? ? .catch( err => console.log('數(shù)據(jù)庫連接失敗', err));

創(chuàng)建數(shù)據(jù)庫

在MongoDB中不需要顯示創(chuàng)建數(shù)據(jù)庫靡狞,如果正在使用的數(shù)據(jù)庫不存在,MongoDB會自動創(chuàng)建隔嫡。

創(chuàng)建集合

創(chuàng)建集合分為兩步甸怕,一是對集合設(shè)定規(guī)則甘穿,二是創(chuàng)建集合,創(chuàng)建mongoose.Schema 構(gòu)造函數(shù)的實例即可創(chuàng)建集合梢杭。

//設(shè)定集合規(guī)則

const courseSchema = new mongoose.Schema ({

? ? ? name : String,

? ? ? author : String,

? ? ? isPublished : Boolean

});

//創(chuàng)建集合并應(yīng)用規(guī)則

const Course = mongoose.model('Course', courseSchema);

//course

創(chuàng)建文檔

創(chuàng)建文檔實際上就是向集合中插入數(shù)據(jù)温兼。

分為兩步:創(chuàng)建集合實例,調(diào)用實例對象下的save方法將數(shù)據(jù)保存到數(shù)據(jù)庫中武契。

//創(chuàng)建集合實例

const course = new Course ({

? ? ? ? name : 'Node.js course',

? ? ? ? author : String,

? ? ? ? tag : ['node','backend'],

? ? ? ? isPublished : true

});

//將數(shù)據(jù)保存到數(shù)據(jù)庫中

course.save ();

Course.create({name : 'JavaScript基礎(chǔ)', author : '黑馬講師', isPublish : true}, (err,doc) => {

? ? ? //錯誤對象

? ? ? console.log(err)

? ? ? //當前插入的文檔

? ? ? console.log(doc)

});

Course.create({name : 'JavaScript基礎(chǔ)', author : '黑馬講師', isPublish : true})

? ? ? .then(doc => console.log(doc))

? ? ? .catch(err => console.log(err))

MongoDB數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)

mongoimport -d 數(shù)據(jù)庫名稱 -c 集合名稱 -file 要導(dǎo)入的數(shù)據(jù)文件

找到mongodb 數(shù)據(jù)庫的安裝目錄募判,將安裝目錄下的bin目錄放置在環(huán)境變量中。

查詢文檔

//根據(jù)條件查找文檔(條件下為空則查找所有文檔)

Course.find().then(result => console.log(result))

//返回文檔集合

[{

? ? _id : 3762897299,

? ? name : 'node.js基礎(chǔ)',

? ? author : '黑馬講師'

},{

? ? _id : 3762897298,

? ? name : 'javascript',

? ? author : '黑馬講師'

}]

//根據(jù)條件查找文檔

Course.findOne({name : 'node.js基礎(chǔ)'}).then(result => console.log(result));

//返回文檔

{

? ? _id : 3762897299,

? ? name : 'node.js基礎(chǔ)',

? ? author : '黑馬講師'

}

//匹配大于吝羞,小于

User.find({age: {$gt : 20, $lt : 50}}).then(result => console.log(result))

//匹配包含

User.find({hobbies : {$in : ['敲代碼']}}).then(result => console.log(result))

//選擇要查詢的字段

User.find().select(' name email').then(result => console.log(result))

//將數(shù)據(jù)按照年齡進行排序

User.find().sort('age').then(result => console.log(result))

//skip跳過多少條數(shù)據(jù)兰伤,limit限制查詢數(shù)量

User.find().skip(2).limit(2).then(result => console.log(result))

刪除文檔

//刪除單個

Course.findOneAndDelete({}).then(result => console.log(result))

//刪除多個

User.deleteMany({}).then(result => console.log(result))

更新文檔

User.updateOne({查詢條件},{要修改的值}).then(result => console.log(result))

User.updateMany({查詢條件},{要修改的值}).then(result => console.log(result))

mongoose驗證

在創(chuàng)建集合規(guī)則時,可以設(shè)置當前字段的驗證規(guī)則钧排,驗證失敗就則輸入插入失敗敦腔。

require:true? 必傳字段

minlength:3? 字符串最小長度

maxlength:20? 字符串最大長度

min : 2? 數(shù)值最小為2

max : 100數(shù)值最大為100

enum : ['html','css','javascript','node.js']

trim : true? 去除字符串兩邊空格

validate:自定義驗證器

default: 默認值

獲取錯誤信息:error.errors['字段名稱'].message

集合關(guān)聯(lián)

通常不同集合的數(shù)據(jù)之間是有關(guān)系的,例如文章信息和用戶信息存儲在不同集合中恨溜,但文章是某個用戶發(fā)表的符衔,要查詢文章的所有信息,就需要用到集合關(guān)聯(lián)糟袁。

使用id對集合進行關(guān)聯(lián)

使用populate方法進行關(guān)聯(lián)集合查詢判族。

集合關(guān)聯(lián)實現(xiàn)

//用戶集合

const User = mongoose.model('User', new mongoose.Schema({ name : {type : String}}));

//文章集合

const Post = mongoose.model('Post', new mongoose.Schema({

? ? title : { type : String},

? ? author : { type : mongoose.Schema.Types.ObjectId,ref:'User'}

}));

//聯(lián)合查詢

Post.find()

.populate('author')

.then(err,result) => console.log(result);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市项戴,隨后出現(xiàn)的幾起案子形帮,更是在濱河造成了極大的恐慌,老刑警劉巖周叮,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩撑,死亡現(xiàn)場離奇詭異,居然都是意外死亡仿耽,警方通過查閱死者的電腦和手機合冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來项贺,“玉大人君躺,你說我怎么就攤上這事】校” “怎么了棕叫?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啥箭。 經(jīng)常有香客問我谍珊,道長,這世上最難降的妖魔是什么急侥? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任砌滞,我火速辦了婚禮,結(jié)果婚禮上坏怪,老公的妹妹穿的比我還像新娘贝润。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盯蝴,像睡著了一般氢伟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宜猜,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼横朋。 笑死,一個胖子當著我的面吹牛百拓,可吹牛的內(nèi)容都是我干的琴锭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衙传,長吁一口氣:“原來是場噩夢啊……” “哼决帖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓖捶,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤地回,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俊鱼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻像,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年亭引,在試婚紗的時候發(fā)現(xiàn)自己被綠了绎速。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焙蚓,死狀恐怖纹冤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情购公,我是刑警寧澤萌京,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站宏浩,受9級特大地震影響知残,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜比庄,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一求妹、第九天 我趴在偏房一處隱蔽的房頂上張望乏盐。 院中可真熱鬧,春花似錦制恍、人聲如沸父能。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何吝。三九已至,卻和暖如春鹃唯,著一層夾襖步出監(jiān)牢的瞬間爱榕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工坡慌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留黔酥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓八匠,卻偏偏與公主長得像絮爷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梨树,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355