項目實戰(連載):基于Angular2+Mongodb+Node技術實現的多用戶博客系統教程(3)

本章主要講什么(一句話)?

《項目實戰:基于Angular2+Mongodb+Node技術實現的多用戶博客系統教程(3)》

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- 基于MongoDB的MyBlog數據庫知識技術儲備(下)

一、前言

上一小節我們先簡單的介紹MongoDB的一些入門的內容,主要包括MongoDB的下載、安裝、配置及MongoDB簡單的建庫,刪庫,查詢文檔等基本功能,本篇我們將繼續《基于MongoDB的MyBlog數據庫設計篇》--高級篇,在此部分內容里將會涉及到以下內容:

1、MongoDB的的增、刪、改、查語法及示例

2、Node與MongoDB的互操作部分

二、內容

2.1、MongoDB支持的數據類型

MongoDB支持許多數據類型的列表下面給出:

?String : 這是最常用的數據類型來存儲數據。在MongoDB中的字符串必須是有效的UTF-8。

?Integer : 這種類型是用來存儲一個數值。整數可以是32位或64位,這取決于您的服務器。

?Boolean : 此類型用于存儲一個布爾值 (true/ false) 。

?Double : 這種類型是用來存儲浮點值。

?Min/ Max keys : 這種類型被用來對BSON元素的最低和最高值比較。

?Arrays : 使用此類型的數組或列表或多個值存儲到一個鍵。

?Timestamp : 時間戳。這可以方便記錄時的文件已被修改或添加。

?Object : 此數據類型用于嵌入式的文件。

?Null : 這種類型是用來存儲一個Null值。

?Symbol : 此數據類型用于字符串相同,但它通常是保留給特定符號類型的語言使用。

?Date : 此數據類型用于存儲當前日期或時間的UNIX時間格式。可以指定自己的日期和時間,日期和年,月,日到創建對象。

?Object ID : 此數據類型用于存儲文檔的ID。

?Binary data : 此數據類型用于存儲二進制數據。

?Code : 此數據類型用于存儲到文檔中的JavaScript代碼。

?Regular expression : 此數據類型用于存儲正則表達式

2.2、MongoDB 插入文檔

insert() 方法

要插入數據到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法。

語法

insert() 命令的基本語法如下:

>db.COLLECTION_NAME.insert(document)

例子

title: 'MongoDB Overview',

description: 'MongoDB is no sql database',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 100

})

這里 mycol 是集合的名稱,如前面的教程中創建。如果集合在數據庫中不存在,那么MongoDB 將創建此集合,然后把它插入文檔。插入文檔中,如果我們不指定_id參數,然后MongoDB 本文檔分配一個獨特的ObjectId。

要插入單個查詢的多個文檔,可以傳遞一個數組 insert() 命令的文件。

示例

{

title: 'MongoDB Overview',

description: 'MongoDB is no sql database',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 100

},

{

title: 'NoSQL Database',

description: 'NoSQL database doesn't have tables',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 20,

comments: [

{

user:'user1',

message: 'My first comment',

dateCreated: new Date(2013,11,10,2,35),

like: 0

}

]

}

])

2.3、MongoDB 更新文檔

MongoDB的 update() 和 save() 方法用于更新文檔的集合。 update()方法更新現有的文檔值,而替換現有的文檔通過的文件中 save() 方法。

MongoDB Update() 方法

update()方法更新現有文檔值。

語法:

update() 方法的基本語法如下

>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)

例子

考慮以下數據mycol集合。

下面的例子將設置新標題'MongoDB Overview'的文件,更新其標題是“New MongoDB Tutorial”

MongoDB默認將只更新單一的文件,來更新多個你需要設置參數置'multi' 為true

Tutorial'}},)

MongoDB Save() 方法

save() 方法替換現有的文檔和通過新的文檔 save() 方法

語法

MongoDB 的 save() 方法的基本語法如下:

>db.COLLECTION_NAME.save()

例子

{

}

)

2.4、MongoDB 刪除文檔

remove() 方法

MongoDB的 remove() 方法用于從集合中刪除文檔。remove() 方法接受兩個參數。第一個是刪除criteria ,第二是justOne標志:

deletion criteria :(可選)刪除標準,根據文件將被刪除。

justOne : (可選)如果設置為true或1,然后只刪除一個文件。

語法:

基本語法remove()方法如下

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

例子

考慮以下數據mycol集合。

下面的例子將刪除所有的文件,其標題是 'MongoDB Overview'

刪除只有一個

如果有多個記錄且要刪除的只有第一條記錄,那么設置remove()方法中justOne參數

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

例子:

先增加兩條記錄:

再刪除:

發現只有第一條刪除了

如果不加第2個參數1,則兩條記錄都會被刪除!

刪除所有文件

如果不指定刪除條件,然后MongoDB將從集合中刪除整個文件。這相當于SQL的truncate命令。

2.5、MongoDB 查詢文檔

find() 方法

要從MongoDB 查詢集合數據,需要使用MongoDB 的 find() 方法。

語法

基本的find()方法語法如下

>db.COLLECTION_NAME.find()

find() 方法將在非結構化的方式顯示所有的文件。

pretty() 方法

結果顯示在一個格式化的方式,可以使用 pretty() 方法.

語法:

例子

{

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "tutorials fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

除了find() 方法外,還有一個 findOne() 法,返回一個文件。

RDBMS Where子句和MongoDB等同語句

要查詢文件的一些條件的基礎上,可以使用下面的操作

AND 在MongoDB中用法

語法:

在 find() 方法,如果通過多個鍵分離',',那么 MongoDB 處理 AND 條件。AND 基本語法如下所示:

例子

下面給出的例子將顯示所有的教程,標題是“MongoDB Overview“

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

對于上面給出的例子相當于where子句 ' where by='fwytech' AND title='MongoDB Overview' , 可以通過任意數量的鍵值對在 find 子句。

MongoDB中OR

語法:

OR條件的基礎上要查詢文件,需要使用$or關鍵字。OR 基本語法如下所示:

{

$or: [

,

]

}

).pretty()

例子

下面給出的例子將顯示所有的教程,由'fwytech' 所寫或標題是MongoDB Overview

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

AND 和 OR 一起使用

例子

下面給出的例子將顯示有像的文件大于100,其標題是“MongoDB Overview'或者是'fwytech' 。等效于 SQL where子句 為 'where likes>10 AND (by = 'fwytech' OR title = 'MongoDB Overview')'

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

2.6、MongoDB Limit/限制記錄

Limit() 方法

要限制 MongoDB 中的記錄,需要使用 limit() 方法。 limit() 方法接受一個數字型的參數,這是要顯示的文檔數。

語法:

limit() 方法的基本語法如下

>db.COLLECTION_NAME.find().limit(NUMBER)

示例

考慮集合myycol具有以下的數據

{ "title":"a",”clicks”:1}

{ "title":"b",”clicks”:2}

{ "title":"c",”clicks”:3}

下面的例子將顯示只有2個文檔,當執行文檔查詢。

{ "title":"a",”clicks”:1}

{ "title":"b",”clicks”:2}

如果不指定數量 limit() 方法的參數,它會顯示從集合中的所有文件。

MongoDB Skip() 方法

除了limit() 方法,還有一個方法skip() 也接受數字類型的參數,并使用跳過的文檔數。

語法:

skip()方法基本語法如下

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

示例:

下面的例子將只顯示第二個文檔。

{ "title":"b",”clicks”:2}

請注意,skip()方法的默認值是0

2.7、Node中操作MongoDB

PS:

前提-1:已經安裝node

前提-2:已經安裝mongodb

前提-3:項目中安裝了mongodb模塊

前提-4:Mongodb服務器已經開啟監聽

命令如下:cnpm install mongodb

2.7.1、連接數據庫

var mongo=require("mongodb");

var host="localhost";

var port="27017";

var server=new mongo.Server(host,port,);//創建數據庫所在的服務器服務器

var db=new mongo.Db("node-mongodb ",server,);//創建數據庫對象

db.open(function (err,db) {//連接數據庫

if(err)

throw err;

else{

console.log("成功建立數據庫連接");

db.close();

}

});

db.on("close", function (err,db) {//關閉數據庫

if(err) throw err;

else console.log("成功關閉數據庫.");

});

PS:關閉數據庫db.close([forceClose],[callback]);

forceClose為true時,強制關閉該數據庫,當數據庫關閉后,不可再使用open開啟數據庫.forceClose為false時,不強制關閉數據庫,當數據庫關閉后,可以再使用open打開.

2.7.2、插入數據

插入數據后,在控制臺中輸出數據文檔的內容

var mongo=require("mongodb");

var host="localhost";

var port="27017";

var server=new mongo.Server(host,port,);//創建數據庫所在的服務器服務器

var db=new mongo.Db("node-mongodb",server,);//創建數據庫對象

db.open(function (err,db) {//連接數據庫

if(err)

throw err;

else{

db.collection("employees", function (err,collection) {

collection.insert(, function (err,docs) {

console.log(docs);

db.close();

});

});

}

});

db.on("close", function (err,db) {//關閉數據庫

if(err) throw err;

else console.log("成功關閉數據庫.");

});

2.7.3、讀取數據

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongodb",server,);

db.open(function (err,db) {

db.collection("employees", function (err,collection) {

if(err) throw err;

else{

collection.find({}).toArray(function(err,docs){

else{

console.log(docs);

db.close();

}

});

}

});

});

2.7.4、帶查詢條件的搜索

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongodb",server,);

db.open(function (err,db) {

db.collection("users", function (err,collection) {

if(err) throw err;

else{

collection.find(}).toArray(function(err,docs){

else{

console.log(docs);

db.close();

}

});

}

});

});

2.7.5、多條件查詢

插入一批數據,并且進行搜索type==food且price字段值小于10

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongo-examples",server,);

var docs=[

{type:"food",price:11},

{type:"food",price:10},

{type:"food",price:9},

{type:"food",price:8},

{type:"book",price:9}

];

db.open(function (err,db) {

db.collection("goods", function (err,collection) {

if(err) throw err;

else{

collection.insert(docs, function (err,docs) {

else{

collection.find(}).toArray(

function(err,docs){

if(err) throw err;

else{

console.log(docs);

db.close();

}

}

);

}

})

}

});

});

查詢中的或的表達:

如:查詢where type=”food” or price

collection.find({$or:[

,

}

]})

三、總結

1.什么是MongoDB?有什么優缺點?

2.MongoDB的增刪改查

3.Node中如何操作MongoDB

四、后述

? ? 本小節我們主要介紹了MongoDB的更常用的較高級一些的內容,主要包括MongoDB的增刪改查及、及如何與Node連結操作的示例代碼。為后繼我們的更高級的項目部分做了一個必要的技術儲備。(PS:本部分內容涉及到一些簡單的Node知識,需要大家自行補充一些關于Node的基本用法,后繼我也打算較系統的出一些關于Node及Angular2的零基礎入門內容)。

? 《基于Angular2+Mongodb+Node技術實現的多用戶博客系統》正在連載中,明天我將為大家推出【第四章:系統后臺Node Express框架搭建】,歡迎各位繼續關注~

? ? 搜索并關注“風舞煙”的簡書專欄、頭條號、微信公眾號、 企鵝媒體平臺,你可以定期收到關于簡書專欄的最新動態以及IT前沿最新技術的高質量經驗文章、視頻分享。

? ? 謝謝大家的支持,歡迎大家留言交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容