mongoDB

mongoDB基礎

一捡多、MongoDB簡介

MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫休玩,提供高性能、高可用性自動擴展的功能馋艺。MongoDB 是用C++語言編寫的非關系型數(shù)據(jù)庫嚎卫。使用高效的二進制數(shù)據(jù)存儲嘉栓,文件存儲格式為BSON (一種JSON 的擴展)等。MongoDB 支持各種編程語言拓诸,包括Python侵佃、Java、C++恰响、GO趣钱、PHP等。

1.1 MongoDB特性

  • 面向集合存儲:數(shù)據(jù)被分組到若干集合胚宦,每個集合可以包含無限個文檔首有,可以將集合想象成RDBMS的表燕垃,區(qū)別是集合不需要進行模式定義。
  • 模式自由:集合中沒有行和列的概念井联,每個文檔可以有不同的key卜壕,key的值不要求一致的數(shù)據(jù)類型。
  • 支持動態(tài)查詢:mongoDB支持豐富的查詢表達式烙常,查詢指令使用json形式表達式轴捎。
  • 完整的索引支持:mongoDB的查詢優(yōu)化器會分析查詢表達式,并生成一個高效的查詢計劃蚕脏。
  • 高效的數(shù)據(jù)存儲:支持二進制數(shù)據(jù)及大型對象(圖片侦副、視頻等)。
  • 支持復制和故障恢復
  • 自動分片以支持云級別的伸縮性驼鞭,支持水平的數(shù)據(jù)庫集群秦驯,可動態(tài)添加額外的服務器

1.2 mongo vs mysql

k-v --> document --> collection --> database)
cloumn --> row --> table --> database
一條document記錄: {"country" : "China", "city": "BeiJing"}
1.創(chuàng)建數(shù)據(jù)庫 >> use database_name; //有則切換,無則創(chuàng)建
2.刪除數(shù)據(jù)庫 >> db.dropDatabase();
3.展示所有數(shù)據(jù)庫>> show dbs;

二挣棕、基本功能

2.1译隘、查詢

  • db.collection.find(document) 查詢數(shù)據(jù)【加pretty()方法后會自動格式化】
  • db.collection.findOne(document) 只返回第一個
  • 條件操作符
等于       db.collection.find({"name":"Lukes"}).pretty()               where name= 'Lukes'
$lt 小于   db.collection.find({"likes":{$lt:50}}).pretty()             where likes  < 50
$lte 小于或等于  db.collection.find({"likes":{$lte:50}}).pretty()      where likes <= 50
$gt 大于    db.collection.find({"likes":{$gt:50}}).pretty()            where likes > 50
$gte 大于或等于      db.collection.find({"likes":{$gte:50}}).pretty()  where likes >= 50
$ne 不等于   db.collection.find({"likes":{$ne:50}}).pretty()           where likes != 50
$in          在多個值范圍內(nèi)
$nin        不在多個值范圍內(nèi)
$all        匹配數(shù)組中多個值
$regex      正則,用于模糊查詢
$size     匹配數(shù)組大小
$mod      取模運算
$exists    字段是否存在
$slice      查詢字段集合中的元素(比如從第幾個之后洛心,第N到第M個元素)

and條件 db.col.find({key1:value1, key2:value2}).pretty()固耘;
or條件 db.col.find({or:[{key1:value1}, {key2:value2}]}).pretty();//pretty指會將顯示的結果優(yōu)化
分頁 db.collection_name.find().limit(number).skip(number); //limit指取幾條數(shù)據(jù)词身,skip指第幾頁
排序 db.collection_name.find().sort({key:1}); //1指順序厅目,-1指倒序

2.2、增刪改

  • db.collection.insertOne(document) 單個文檔插入到集合中
  • db.collection.insertMany(document) 多個文檔插入到集合中
  • db.collection.insert(document) 單個或者多個文件插入到集合中
  • db.collection.updateOne(document) 更新單條
  • db.collection.updateMany(document) 更新多條
  • db.collection.deleteOnedocument() 刪除單條文檔
  • db.collection.deleteMany(document) 刪除多條文檔
  • db.collection.save(document);
  • db.collection.remove(query,{ justOne:boolean, writeConcern:document })

其中: query:(可選)刪除的文檔的條件偿枕。
justOne: (可選)如果設為 true 或1璧瞬,則只刪除一個文檔户辫。
writeConcern:(可選)拋出異常的級別渐夸。
注:如果是直接調(diào)用db.collection.remove() //則刪除所有數(shù)據(jù)

2.3、聚合查詢:類似MySQL中的count渔欢、sum墓塌、group by

三種聚合查詢方法:聚合管道、map-reduce 和單一目標聚合方法奥额。
聚合管道方法:MongoDB 的聚合框架就是將文檔輸入處理管道苫幢,在管道內(nèi)完成對文檔的操作,最終將文檔轉換為聚合結果垫挨。最基本的管道階段提供過濾器韩肝,其操作類似查詢和文檔轉換,可以修改輸出文檔的形式九榔。其他管道操作提供了按特定字段對文檔進行分組和排序的工具哀峻,以及用于聚合數(shù)組內(nèi)容(包括文檔數(shù)組)的工具涡相。此外,在管道階段還可以使用運算符來執(zhí)行諸如計算平均值或連接字符串之類的任務剩蟀。聚合管道可以在分片集合上運行催蝗。聚合管道方法的流程參見下圖。


20069865-3c3cfb423b0b78fa.png

MongoDB 中的聚合操作語法


2.png
  • Query 設置統(tǒng)計查詢條件育特,類似于 SQL 的 where丙号,

  • field1 為分類字段,要求使用 _id 名表示分類字段缰冤,

  • field2 為包含各種統(tǒng)計操作符的數(shù)字型字段犬缨,如 sum、avg棉浸、$min 等遍尺。

  • 聚合內(nèi)置了很多函數(shù)

  • $project:修改輸入文檔的結構′剔郑可以用來重命名乾戏、增加或刪除域,也可以用于創(chuàng)建計算結果以及嵌套文檔三热。
  • match:用于過濾數(shù)據(jù)鼓择,只輸出符合條件的文檔。match使用MongoDB的標準查詢操作就漾。
  • $limit:用來限制MongoDB聚合管道返回的文檔數(shù)呐能。
  • $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔抑堡。
  • $group:將集合中的文檔分組摆出,可用于統(tǒng)計結果。
  • $sort:將輸入文檔排序后輸出首妖。
  • $geoNear:輸出接近某一地理位置的有序文檔偎漫。
  • $unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值有缆。

實例一

db.getCollection('A_collection').aggregate({
    $addFields:{
      "name":{
         $cond:[{$ne:["$alias", undefined]},"$alias","$host_name"]
      }
    },
    {
      $project:{
         "name":1
      }
    } 
})  //collection的alias字段是否存在,如果存在,就取alias,否則取host_name字段

實例二

{ "_id" : 1, "item" : "abc1", qty: 300 }
{ "_id" : 2, "item" : "abc2", qty: 200 }
{ "_id" : 3, "item" : "xyz1", qty: 250 }
//根據(jù)qty的值來生成新的數(shù)據(jù)(值)
db.inventory.aggregate([
  {$project:
       { item: 1,
         discount: {$cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }}
       }
  }])
//output  discount是新的鍵,它根據(jù)cond的if判斷后,分別被賦上了相應的值
 { "_id" : 1, "item" : "abc1", "discount" : 30 }
 { "_id" : 2, "item" : "abc2", "discount" : 20 }
 { "_id" : 3, "item" : "xyz1", "discount" : 30 }

三象踊、mongo用戶

1、mongo授權啟動

  1. 數(shù)據(jù)庫用戶角色:read棚壁、readWrite;
  2. 數(shù)據(jù)庫管理角色:dbAdmin杯矩、dbOwner、userAdmin袖外; (擁有創(chuàng)建數(shù)據(jù)庫, 和創(chuàng)建用戶的權力)
  3. 集群管理角色:clusterAdmin史隆、clusterManager、clusterMonitor曼验、hostManager泌射;(管理員組, 針對整個系統(tǒng)進行管理)
  4. 備份恢復角色:backup头镊、restore;
  5. 所有數(shù)據(jù)庫角色:readAnyDatabase魄幕、readWriteAnyDatabase相艇、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超級用戶角色:root //這里還有幾個角色間接或直接提供了系統(tǒng)超級用戶的訪問(dbOwner 纯陨、userAdmin坛芽、userAdminAnyDatabase)
  7. 內(nèi)部角色:__system
  • 無權限啟動 >> mongod -f ***.conf
  • 授權啟動 >> mongod -f ***.conf -auth
  • 以授權模式啟動后,連接mongo時翼抠,需要帶上用戶名和密碼

2咙轩、創(chuàng)建用戶

db.createUser({
  user:<name_string>,                        # 字符串 用戶名
  pwd:<password_string>,                     # 字符串 密碼
  roles:[{role:<role_name>,db:<db_name>}]    # 數(shù)組+對象 指定用戶的角色
}
)

3、刪除用戶

db.dropUser(<user_name>)     刪除某個用戶阴颖,接受字符串參數(shù)
db.dropAllUser()             刪除當前庫的所有用戶

四活喊、BSON

MongoDB中的JSON文檔存儲在名為BSON(二進制編碼的JSON)的二進制表示中。
與其他將JSON數(shù)據(jù)存儲為簡單字符串和數(shù)字的數(shù)據(jù)庫不同量愧,BSON編碼擴展了JSON表示钾菊,
使其包含額外的類型,如int偎肃、long煞烫、date、浮點數(shù)和decimal128累颂。這使得應用程序更容易可靠地處理滞详、排序和比較數(shù)據(jù)。
連接MongoDB的Go驅動程序中有兩大類型表示BSON數(shù)據(jù):D和Raw紊馏。
類型D家族被用來簡潔地構建使用本地Go類型的BSON對象料饥。這對于構造傳遞給MongoDB的命令特別有用。D家族包括四類:

  • D:一個BSON文檔朱监。這種類型應該在順序重要的情況下使用岸啡,比如MongoDB命令。
  • M:一張無序的map赌朋。它和D是一樣的凰狞,只是它不保持順序篇裁。
  • A:一個BSON數(shù)組沛慢。
  • E:D里面的一個元素。

GridFS

  • GridFS是MongoDB的一個子模塊达布,主要用于在MongoDB中存儲文件团甲,相當于MongoDB內(nèi)置的一個分布式文件系統(tǒng)。
  • 本質(zhì)上還是講文件的數(shù)據(jù)分塊存儲在集合中黍聂,默認的文件集合分為fs.files和fs.chunks躺苦。
  • fs.files是存儲文件的基本信息身腻,比如文件名,大小匹厘,上傳時間嘀趟,md5等。
  • fs.chunks是存儲文件真正數(shù)據(jù)的地方愈诚,一個文件會被分割成多個chunk塊進行存儲她按,一般為256k/個。
    如果你的項目中用到了MongoDB炕柔,那么你可以使用GridFS來構建一個文件系統(tǒng)酌泰,這樣就不用去購買第三方的存儲服務了。
    GridFS的好處是你不用單獨去搭建一個文件系統(tǒng)匕累,直接使用Mongodb自帶的即可陵刹,備份,分片都依賴MongoDB欢嘿,維護起來也方便衰琐。

GO語言操作mongoDB

https://www.cnblogs.com/Dr-wei/p/11742293.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炼蹦,隨后出現(xiàn)的幾起案子碘耳,更是在濱河造成了極大的恐慌,老刑警劉巖框弛,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辛辨,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑟枫,警方通過查閱死者的電腦和手機斗搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慷妙,“玉大人僻焚,你說我怎么就攤上這事∠ダ蓿” “怎么了虑啤?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長架馋。 經(jīng)常有香客問我狞山,道長,這世上最難降的妖魔是什么叉寂? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任萍启,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘勘纯。我一直安慰自己局服,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布驳遵。 她就那樣靜靜地躺著淫奔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堤结。 梳的紋絲不亂的頭發(fā)上搏讶,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音霍殴,去河邊找鬼媒惕。 笑死,一個胖子當著我的面吹牛来庭,可吹牛的內(nèi)容都是我干的妒蔚。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼月弛,長吁一口氣:“原來是場噩夢啊……” “哼肴盏!你這毒婦竟也來了?” 一聲冷哼從身側響起帽衙,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤菜皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厉萝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恍飘,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年谴垫,在試婚紗的時候發(fā)現(xiàn)自己被綠了章母。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡翩剪,死狀恐怖乳怎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情前弯,我是刑警寧澤蚪缀,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站恕出,受9級特大地震影響询枚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剃根,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一哩盲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈醉,春花似錦廉油、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渣慕,卻和暖如春嘶炭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逊桦。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工眨猎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强经。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓睡陪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匿情。 傳聞我的和親對象是個殘疾皇子兰迫,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容