本章主要講什么(一句話)?
《項目實戰:基于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前沿最新技術的高質量經驗文章、視頻分享。
? ? 謝謝大家的支持,歡迎大家留言交流。