《實戰Angular2/Mongodb/Node博客系統(二)》要點:
本文介紹了實戰Angular2/Mongodb/Node博客系統(二),希望對您有用。如果有疑問,可以聯系我們。
相關主題:非關系型數據庫
在開始正式講解本系統前,我們可能需要給大家準備一些基本知識的儲備,本節我們將會給大家快速的補充一下本系統必須的MongoDB部分的知識點,具體包含以下內容:
了解什么是MongoDB以及MongoDB的特性
掌握MongoDB最常見的用法
掌握MongoDB更高級的一些用法
MongoDB與Node的互操作
2.1、MongoDB簡介
官方定義:MongoDB 是一個基于分布式文件存儲的數據庫.由C++語言編寫.旨在為WEB應用提供可擴展的高性能數據存儲辦理方案.MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的.他支持的數據結構非常松散,是類似json的bson格式,因此可以存儲比較復雜的數據類型.Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引.
通俗解釋: Mongo DB ,是目前在IT行業非常流行的一種非關系型數據庫(NoSql),其靈活的數據存儲方式,備受當前IT從業人員的青睞.Mongo DB很好的實現了面向對象的思想(OO思想),在Mongo DB中 每一條記錄都是一個Document對象.Mongo DB最大的優勢在于所有的數據持久操作都無需開發人員手動編寫SQL語句,直接調用辦法就可以輕松的實現CRUD操作.
特點
1、MongoDB是基于文檔的數據庫
2、是介于關系型數據庫和非關系型數據庫之間的產品(最像關系性數據庫的NoSQL)
3、支持類似json的bson格式,數據結構非常松散
官網地址:http://www.mongodb.org/ 百度百科:http://baike.baidu.com/subview/3385614/9338179.htm
2.2、MongoDB優缺點
優點: 弱一致性 文檔結構的存儲方式 內置GridFS(分布式文件系統)
缺點: 不支持事務 空間占用大
2.3、主要適用場合
其主要場景如下:
1)網站實時數據處理.它非常適合實時的插入、更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性.
2)緩存.由于性能很高,它適合作為信息基礎設施的緩存層.在系統重啟之后,由它搭建的持久化緩存層可以避免下層的數據源過載.
3)高伸縮性的場景.非常適合由數十或數百臺服務器組成的數據庫,它的路線圖中已經包括對MapReduce引擎的內置支持.
不適用的場景如下:
1)要求高度事務性的系統.
2)傳統的商業智能應用.
3)復雜的跨文檔(表)級聯查詢.
1)在官網直接下載安裝包,下載地址:http://www.mongodb.org/downloads
2)安裝非常的簡單只要,解壓或者安裝就可以.這取決于你下載的是msi安裝包
是zip壓縮包.
如果是zip的壓縮包.直接解壓,解壓后,放在D:/MongoDB目錄下.為了命令行的方便,可以把D:/MongoDB/bin加到系統環境變量的path中.
如果是msi安裝包.基本默認安裝下一步下一步即可,注意你的安裝路徑.
3)測試是否安裝成功
D:\>mongod --dbpath D:/MongoDB/data
Sun Oct 24 15:07:05 MongoDB starting : pid=2472 port=27017
dbpath=D:/MongoDB/data 32-bit
** NOTE: This is a development version (1.7.1) of MongoDB.
....
Sun Oct 24 15:07:05 [websvr] web admin interface listening on port 28017
由于是開發版,上面就有個警告,沒關系,忽略它.
最后兩行說明的數據庫端口和Web端口,分別是27017和28017,在瀏覽器中打開http://localhost:27017,可以看到其相關的一些信息.
這樣說明安裝成功.
第一部分:MongoDB基礎
4.1、創建庫
use 命令
MongoDB use DATABASE_NAME 用于創建數據庫.該命令將創建一個新的數據庫,如果它不存在,否則將返回現有的數據庫.
語法:
use DATABASE 語句的基本語法如下:
use DATABASE_NAME
示例:
如果想創建一個數據庫名稱 <testDB>, 那么 use DATABASE 語句如下:
>use testDB
switched to db testDB
要檢查當前選擇的數據庫使用命令 db
>db
testDB
PS:
前提1 - mongodb安裝在d:/mongodb目錄下
前提2 - 已經將d:/mongdb/bin配置在windows環境變量的path路徑中
前提3 – 在d:/mongodb/目錄下新建一data文件夾
前提4 – 運行cmd命令,在命令行中健入如下命令:
> mongod --dbpath D:/MongoDB/data
運行如下圖所示:
說明mongodb服務器啟動在:127.0.0.1:385979端口處監聽哀求!
重新打開一新的控制臺:
并健入如下命令:mongo
用于連結服務器,默認連結他的默認數據庫test
說明創建數據庫成功!
查看數據庫:
控制臺中健入如下命令:show dbs,注意此時顯示的只會有local數據庫,卻沒有testDB,原因是因此時數據庫并沒有集合(數據),所以此時只有邏輯數據庫產生,并沒有產真正意義上的物理數據,必須調用db.createCollection("集合名")后,具體的后面會講到,再次運行: show dbs命令,才能看到testDB數據庫,另外,mongodb的命令是區分大小寫的,這一點也是要注意!
4.2、刪除庫
dropDatabase()辦法
MongoDB db.dropDatabase() 命令是用來刪除一個現有的數據庫.
語法:
dropDatabase() 命令的基本語法如下:
> db.dropDatabase()
這將刪除選定的數據庫.如果還沒有選擇任何數據庫,然后它會刪除默認的 ' test' 數據庫
示例:
首先,檢查列表數據庫通過使用命令 show dbs
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
>
如果想刪除新數據庫 <mydb>, 那么 dropDatabase() 命令如下:
>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>
現在檢查的數據庫列表:
>show dbs
local 0.78125GB
test 0.23012GB
>
4.3、創建集合
在mongodb里面,沒有表的概念,集合(collections)就相當于傳統數據庫中的表.
createCollection() 辦法
MongoDB db.createCollection(name, options) 是用來創建集合.
語法:
基本的 createCollection() 命令語法如下:
db.createCollection(name, options)
在命令中, name 是要創建的集合的名稱. Options 是一個文件,用于指定配置的集合
選項參數是可選的,所以只需要到指定的集合名稱.以下是可以使用的選項列表:
例子:
createCollection() 辦法不使用選項的基本語法如下:
>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>
可以檢查通過使用創建的集合命令 show collections
>show collections
mycollection
system.indexes
下面的例子顯示了幾個重要的選項 createCollection()辦法的語法:
>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>
在MongoDB中,不需要創建集合.當插入一些文件 MongoDB 自動創建的集合.
>db.newdb.insert({"name" : "fwytech"})
>show collections
mycol
mycollection
system.indexes
newdb
>
4.4、刪除集合
drop() 辦法
MongoDB 的 db.collection.drop() 是用來從數據庫中刪除一個集合.
語法:
drop() 命令的基本語法如下
db.COLLECTION_NAME.drop()
示例:
首先,檢查可用的集合在數據庫 mydb
>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
fwytech
>
現在刪除集合名稱為 mycollection
>db.mycollection.drop()
true
>
再次檢查到數據庫中的集合列表
>show collections
mycol
system.indexes
fwytech
>
drop() 辦法將返回 true,如果選擇成功收集被丟棄,否則將返回 false
第二部分: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框架搭建.
《實戰Angular2/Mongodb/Node博客系統(二)》是否對您有啟發,歡迎查看更多與《實戰Angular2/Mongodb/Node博客系統(二)》相關教程,學精學透。維易PHP學院為您提供精彩教程。