摘要:學(xué)習(xí)已經(jīng)有三周了,是時候來一發(fā)學(xué)習(xí)總結(jié)啦。相關(guān)簡介是非關(guān)系型的數(shù)據(jù)庫。簡單在于,所有的都由大括號,中括號,以及對構(gòu)成。不同于,它是同步的。
學(xué)習(xí)mongoDB已經(jīng)有三周了,是時候來一發(fā)學(xué)習(xí)總結(jié)啦。以下是個人學(xué)習(xí)心得總結(jié),非官方,可能有紕漏和不準(zhǔn)確之處,歡迎指正。
1.mongoDB是非關(guān)系型(nosql)的數(shù)據(jù)庫。
2.mongoDB是無模式(schemaless)的數(shù)據(jù)庫,每個文檔都有他自己的模式。
3.mongoDB是面向集合(collection)的數(shù)據(jù)庫,它集成高擴展性和高性能于一身。
4.mongoDB不存在collection和collection之間 的join和transaction操作。
5.mongoDB通過mongo Shell展示給用戶的數(shù)據(jù)格式是JSON,存儲在mongoDB中的格式是BSON(JSON 的二進制格式),正是這種二進制存儲方式更加提升了數(shù)據(jù)庫的性能。
6.JSON是簡單和復(fù)雜的結(jié)合體。簡單在于,所有的JSON都由大括號,中括號,以及key-value對構(gòu)成。
復(fù)雜之處在于,它可以進行各種任意的深層次的嵌套,來達到“任何你想要的數(shù)據(jù)模式”,這也是JSON的精髓之所在。
7.mongo Shell 不同于nodeJS,它是同步的。
8.mongoDB的數(shù)據(jù)模式設(shè)計的關(guān)鍵問題是“有沒有必要嵌入”,通俗來講就是有沒有必要劃分很多collection,是否可以適當(dāng)?shù)膶⒁恍ヽollection進行合并(嵌入embed),后面第三部分詳談。
9.mongoDB和nodeJS一樣底層都是用C++寫的,這也是性能好的原因之一。
10.訪問mongoDB的方式有兩種,一種是直接通過mongoShell訪問,這種訪問方式簡單快捷,操作命令跟js函數(shù)語法是無縫對接的,第二種就是app通過driver進行訪問了。
也就是傳說中的增刪改查,以下右邊的就是mongoDB的增刪改查:
Create - Insert
Read - Find
Update - Update
Delete - Remove
值得一說的是,mongoDB的操作函數(shù)(方法)和js 編程語言的語法的無縫對接的,這無形就形成了代碼大一統(tǒng)的局面,不像一些SQL的語句是獨立于編程語言的。
1.Findnodejs中的mongoDB driver:
db.collection.find( { 1 }, { 2 }, { 3 } ); // 1.Selector 選擇器,就類似于SQL中的 WHERE // 2.projection 顯示器,用于選擇要顯示的 key // 3.option 選項, 用于選擇排序,限制條數(shù),跳過的操作 var selector = {type :"exam"} , projection = {score: 1} , option = {sort: 1, skip: 50, limit :20}; db.collection.find(selector, projection, option)
在MongoShell中查詢
db.scores.find({type :"exam"}, {score: 1}).sort({score: 1}).skip(50).limit(20)
其中selector涉及到$gt, $gte, $lt, $lte, $regex, $exists, $all, $in的使用,
db.score.find({score: {$gt: 60, $lt: 100}) //查找score區(qū)于60到100之間記錄db.user.find({name:{$regex:"q"},email:{$exists: true}) //名字中含有q,并有Email的 db.fruits.find({$all :["banana", "apple"]}) //同時包含香蕉和蘋果 db.fruit.find({$in : ["apple", "pear"]}) //有蘋果或者有梨2.Update
db.people.update( { 1 } , { 2 } , { 3 } ) // 1. selector 同上 // 2. operator // 3. option
其中operator涉及 $set $unset $inc 用來選擇更新相關(guān)屬性
db.people.update({name:"Alice"}, {name: "Alice", age:30}) //機械覆蓋式更新 db.people.update({name:"Alice"}, {$inc:{age: 1}}) //選擇更新age+1 db.people.update({name:"Alice"}, {$unset:{profession:1}}) //刪除profession屬性
利用$push $pop $ pushAll $pull $pullAll $addToSet 操作來數(shù)組
//設(shè)id為1 的數(shù)組 //[ 1,2,5,4,6] db.arrays.update({_id : 1}, {$pop: {a: 1}}) //[ 1, 2, 5, 4 ] db.arrays.update({_id : 1}, {$pop: {a: -1}}) //[ 2, 5, 4 ] db.arrays.update({_id : 1}, {$pushAll: {a:[7,8,9]}} //[ 2, 5, 4, 7, 8, 9] db.arrays.update({_id : 1}, {$pull:{a: 5}}) //[ 2, 4, 7, 8, 9] db.arrays.update({_id : 1}, {$pullAll{a :[2,4,8]}}) //[ 7, 9] db.arrays.update({_id : 1}, {addToSet{ a : 5}}) //[ 7, 9, 5] db.arrays.update({_id : 1}, {addToSet{ a : 5}}) //[ 7, 9, 5]
總結(jié): $push 和 $pull這一對操作的類似數(shù)組的 『位移』就像stack
而 $ pushAll $pull $pullAll $addToSet 則直接 操作的是 『數(shù)組的值』
最后就是update中的option了,涉及兩個 $multi 和 $upsert
// 假如要update的對象在collection中沒有找到,但是還是要update則需要用upsert db.people.update({age:{$gt:50},{$set:{name:"William"}},{upsert: true}) //更新多條數(shù)據(jù),則必須使用 multi : true 否則只更新首條數(shù)據(jù) db.people.update({}, {$set{title:{"Dr"}}, {multi: true})3.Remove
這個簡單只需要selector 即可刪除選中記錄,值得一提的是與update不同,操縱刪除多條數(shù)據(jù)不需要使用$multi ,直接刪除即可。
(未完待續(xù))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18712.html
摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫,在這個節(jié)目可以對數(shù)據(jù)庫進行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫,在這個節(jié)目可以對數(shù)據(jù)庫進行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
摘要:說到檔案系統(tǒng),選文檔數(shù)據(jù)庫再合適不過了。熟悉的人看這個會很眼熟,沒錯,這就是從借鑒過來,并用在我的關(guān)系數(shù)據(jù)庫查詢上。接口規(guī)范接口的主要目是為了傳遞數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)已經(jīng)在上面給出。為便于不同系統(tǒng)不同終端的數(shù)據(jù)交換,也將應(yīng)當(dāng)在接口支持之內(nèi)。 說到檔案系統(tǒng),選文檔數(shù)據(jù)庫再合適不過了。談到文檔數(shù)據(jù)庫一般想到的是 MongoDB、CouchDB 之類的,可這里要說的不是這些,而是另一個 NoSQL...
摘要:說到檔案系統(tǒng),選文檔數(shù)據(jù)庫再合適不過了。熟悉的人看這個會很眼熟,沒錯,這就是從借鑒過來,并用在我的關(guān)系數(shù)據(jù)庫查詢上。接口規(guī)范接口的主要目是為了傳遞數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)已經(jīng)在上面給出。為便于不同系統(tǒng)不同終端的數(shù)據(jù)交換,也將應(yīng)當(dāng)在接口支持之內(nèi)。 說到檔案系統(tǒng),選文檔數(shù)據(jù)庫再合適不過了。談到文檔數(shù)據(jù)庫一般想到的是 MongoDB、CouchDB 之類的,可這里要說的不是這些,而是另一個 NoSQL...
閱讀 3338·2023-04-26 00:07
閱讀 3948·2021-11-23 10:08
閱讀 2958·2021-11-22 09:34
閱讀 868·2021-09-22 15:27
閱讀 1758·2019-08-30 15:54
閱讀 3763·2019-08-30 14:07
閱讀 926·2019-08-30 11:12
閱讀 691·2019-08-29 18:44