主頁 > 資料庫 > mongodb 基礎入門教程

mongodb 基礎入門教程

2020-09-13 17:51:45 資料庫

算是學習下來精煉的筆記,希望對大家有幫助,如果有問題歡迎大家指正,

0.概述

MongoDB 是由C++語言撰寫的,是一個基于分布式檔案存盤的開源資料庫系統,

在高負載的情況下,添加更多的節點,可以保證服務器性能,

MongoDB 旨在為WEB應用提供可擴展的高性能資料存盤解決方案,

MongoDB 將資料存盤為一個檔案,資料結構由鍵值(key=>value)對組成,MongoDB 檔案類似于 JSON 物件,欄位值可以包含其他檔案,陣列及檔案陣列,

下面是與sql概念的對比,能夠幫助我們更好的理解mongodb,

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 資料庫
table collection 資料庫表/集合
row document 資料記錄行/檔案
column field 資料欄位/域
index index 索引
table joins 表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id欄位設定為主鍵

總結下來,傳統的關系型資料庫的內容結構是

  • 資料庫
  • 欄位

Mongodb與之對應的就是

  • 資料庫
  • 集合
  • 檔案

1.brew安裝

不推薦用brew,因為現在mongodb閉源了,brew里已經搜索不到mongodb,不過還是可以用brew安裝的,這篇就不寫了,

2.官網下載

直接去官網下載一個zip,解壓完放到usr/local/里(control+shift+,可以顯示隱藏檔案夾),改名為mongodb,

然后添加一個環境變數就可以用了

$ export PATH=/usr/local/mongodb/bin:$PATH

這樣就添加好了,反正就是現在可以用了,

可以用mongo來測驗是否安裝好了,如果都弄好了應該會彈出版本,

3.創建data/db檔案夾

接下來就是新建data/db然后運行mongodb的步驟了,

不過mac os catalina現在有問題,跟目錄不讓寫東西了,所以要曲線救國,根據mongodb給的最新的解決辦法就是在/Users/(你的用戶名)/data/db/里當目錄了

最后帶上--dbpath= ,如果不添加會默認到/data/db里

sudo mongod --dbpath=/Users/Wangzirui/data/db

如果不是卡特琳娜那好說,

sudo mkdir -p /data/db 然后 sudo mongod 就完事了,

更改catelina限制之后(關閉sip),可以直接用 sudo mount -uw / 更改跟目錄權限,就可以直接sudo mongod就完事了,

然后另一個終端進入/usr/loacl/mongodb/bin/

然后./mongo就啟動了mongo的客戶端

或者直接mongo也可以,

4.開啟服務創建客戶端

啟動服務:

sudo mount -uw /

sudo mongod

啟動客戶端:

mongo

5.命令

5.1 db操作

  • 顯示資料庫

    • show dbs
  • 切換資料庫,沒有就新建一個

    • use admin
  • 顯示你在哪個資料庫里

    • Db
  • 洗掉當前你use的那個資料庫

    • db.dropDatebase()
  • 新建資料庫

    • use 資料庫名字
    • 建完了show dbs不會立刻顯示,因為剛才新建的資料庫里面沒有資料,所以顯示不出來,

5.2 collection操作

  • 顯示這個資料庫中有什么集合

    • show collections
  • 新建集合,在use 一個資料庫的情況下

    • db.createCollections(name,options)
    • 然后show dbs現在可以看到use的資料庫了
  • 洗掉集合 ,在現在這個Use的資料庫的情況下

    • db.你想要的collectionname.drop()
    • 然后就刪掉了

5.3 document操作

collectionname代指相對應的collcetion名字(mysql里叫表,Mongodb里叫collection,都是一個資料庫里的一種結構) 現在操作的不是表也不是集合,而是集合里的一個資料結構叫做document,檔案,檔案相當于mysql里的一個記錄行,

  • 往collection里加資料,直接新建document

    • db.collectionname.insert({"name":"wangzirui"})
    • 增加多條要在insert的多個物件的外面加一個中括號,表示這是一個物件陣列,
    • db.collectionname.insert([{name:"wangzirui"},{name:"laoli"}])
  • 查看collection里的資料

    • db.collectionname.find()
  • Save,在_id一樣的情況下可以不報錯,然后直接覆寫掉剛才重復Id的內容,

    • db.collectionsname.save({_id:1001,name:"laowang",age:22})
  • 更新document資料

    • db.collectionname.update({當前資料},{替換資料},{配置項})
    • db.collectionname.update({name:"laotie"},{name:"ergou"})
    • 這樣會洗掉其他內容,只存在一個name :ergou 所以要加$set保留其他的引數
    • db.collectionname.update({name:"laotie"},{$set:{name:"ergou"}})
    • 配置項里加{Multi:true}加一個這個的話可以讓多個name:"laotie"一起改
    • db.collectionname.update({name:"laotie"},{$set:{name:"ergou"}},{multi:true})
  • 洗掉document內容,如果不加第二個引數,默認是把集合里的符合第一條的都刪掉,

    • Db.collectionname.remove({name:"laotie"},{justOne:true})

5.4 document 查詢

經過上面的講述,能了解到一點,基于database來查詢collections里的資料都是通過db.collcetion_name.方法 來進行操作的,同理,對document的查詢,我們之前也在查看collection時用過,他就是find()方法,

find里面可以加引數,不加的話就是現實collection里所有的document,

  • find()方法里可以加條件,例如db.collectionname.find({age:18})

    • 如果一行一行的話不好看,可以再db.collectionname.find({age:18})后面加.pretty()
  • 比較運算子

    • less than 小于 $lt db.collection_name.find(age:{$lt:18})
    • less than equal 小于等于 $lte
    • Geater than 大于 $gt
    • $gte 大于等于
    • $ne 不等于
  • 取范圍內的 $in

    • $in:[10,20,30]
    • db.collection_name.find({age:{$in:[10,20,30]}})
  • 并操作

    • db.collection_name.find(age:18,name:"laotie")
  • 或操作

    • db.collection_name.find({$or:[{age:18},{name:"laotie"}]}
  • 正則

    • db.collection_name.find({age:/1/})或者db.collection_name.find({age:$regex:"1"})
  • 限制和跳過,一般用于分頁

    • limit(2)
    • skip(2)
  • 投影

    • 比如說find({這里放具體引數},{這里放投影})
    • db.collection_name.find({age:{$lt:18}},{_id:0,age:1}) 這樣只會顯示每個物件里面只有一個age選項了
    • 注意,如果投影里不加_id的選項的話 ,默認是自動顯示的,只能給_id設定 0,如果別的欄位不想讓他顯示直接不在里面加,其他的想要顯示的話直接把屬性加進去就行了,
  • 通過Js函式來篩選資料

    • $where:

    • db.collection_name.find({$where:function(){

      Return age>10}})

  • 根據某個欄位排序

    • sort
    • db.collection_name.find().sort({age:1}) 如果降序的話要帶-1
  • 計數

    • count()

    • 直接在查詢出來的后面加上就可以顯示了

    • db.collection_name.find({$where:function(){

      Return age>10}}).count()

  • 去重

    • db.student.distinct("name",{"age" : 18})
    • 這樣可以直接把name一樣還有age為18的都給去重

6.備份和恢復

6.1備份

直接在終端輸入,不要在mongodb的客戶端輸入

mongodump -h hostname -d dbname -o dbdirectory

-h 服務器地址,可以指定埠號,本機可以不填

-d 具體Mongodb下哪個資料庫

-o 你想保存到本地的什么地方

例如本機 下在termainal直接輸入 mongodump -d laotie -o wenjianjia

然后就把 laotie這個資料庫保存到Users/wangzirui/wenjianjia這個檔案夾里了

6.2恢復

同樣直接在終端輸入

Mongorestore -h hostname -d dbname --dir

-h 服務器地址,可以指定埠號,本機可以不填

-d 你想讓這個資料庫叫什么,不一定是原名

-Dir 這個備份檔案在哪里

7.聚合

aggregate,就是一個管道,類似中間件或者是函式的鏈式呼叫,最侄訓出想要的資料,

7.1group

首先放一個student集合的資料,聚合所有的操作都是按照這些資料來的,

> db.student.find()
{ "_id" : ObjectId("5e003b92f197cb08dc74a311"), "name" : "duanyuxin", "age" : 21, "sex" : "male" }
{ "_id" : ObjectId("5e003b92f197cb08dc74a312"), "name" : "baiyu", "age" : 20, "sex" : "male" }
{ "_id" : ObjectId("5e003f66f197cb08dc74a313"), "name" : "wangzirui", "age" : 22, "sex" : "male" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a314"), "name" : "zhuhuan", "age" : 22, "sex" : "female" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a315"), "name" : "caoyajing", "age" : 12, "sex" : "female" }

先放例子:

> db.student.aggregate({
 	 $group:{_id:"$sex",avg_age:{$avg:"$age"}}
})


{ "_id" : "male", "avg_age" : 21 }
{ "_id" : "female", "avg_age" : 17 }

$group的物件里,前面開頭的域(欄位)代表下面將要輸出的域的值, 后面的$sex表示的是我拿什么東西當做group分組的鍵值,如果我針對不同的age分組,那么我將會得到

> db.student.aggregate({
 	 $group:{_id:"$age"}
})

{ "_id" : "12"}
{ "_id" : "20"}
{ "_id" : "21"}
{ "_id" : "22"}

的結果,

接著說avg_age,這個域是我們自己定義的,(可能是先入為主,我總覺得說欄位更為適應,大家也更容易理解),叫什么都行,但是后面$avg:"$age"的意思就是,首先前面$avg就是取平均值,取得就是你后面$age的平均值,然后輸出的時候就列印"avg_age:前面符合id分類的檔案的age平均值"

如果想計算整個檔案的某些值,僅需要把_id:null然就可以不分組,直接用整個檔案來算,

> db.student.aggregate({
 	 $group:{_id:null,avg_age:{$avg:"$age"}}
})

{ "_id" : null, "avg_age" : 19.4 }


$sum:

另外講一個$sum的用法,先看怎么用,

> db.student.aggregate({
 	 $group:{_id:null,count:{$sum:1},avg_age:{$avg:"$age"}}
})

{ "_id" : null, "count" : 5, "avg_age" : 19.4 }

在剛才的基礎上加了一個$sum:1$sum顧名思義是求和用的,后面是求和的倍數,如果你設成2的話結果就乘2變成10.一般用來計數的話普遍還是設定成1的,

利用$group去重:

$group不止可以添加一個分組條件,也可以添加多個分組條件,如果把每個條件都對應檔案的域,那么就相當于去重操作,

> db.student.aggregate({
 	 $group:{_id:{name:"$name",sex:"$sex",age:"$age"}}
})

然后接下來用別的通道來進行下一步的操作就可以了,但是接下來的操作要用到的屬性就是$_id.name 類似的,因為我們去重時把屬性都給了叫_id的域,

7.2$project

重構輸出結構,也就是在aggregete的通道特性,然在最后調整你想要的輸出結構,大體上和投影類似,

放栗子:

> db.student.aggregate(
  {
 	  $group:{_id:null,count:{$sum:1},avg_age:{$avg:"$age"}}
	},
  {
  $project:{sex:"$_id",count:"$count",avg_age:"$avg_age"}
	}
)

{ "_id" : null, "sex" : null, "count" : 5, "avg_age" : 19.4 }

同理,可以用1 或者0代替,具體不舉例子了,沒什么大用,

7.4 $match

聽名字就知道是過濾用的,雖然find同樣可以過濾,但是不能將find出來的結果傳給下一個管道,

比如說你想呀知道年齡大于20的男生和女生分別有幾個人

可以按照下面的方式操作

db.student.aggregate(
	{$match:{age:{$gt:19}}},
 {$group:{_id:"$sex",count:{$sum:1}}},
 {$project:{_id:0,sex:"$_id",count:1}}
)

{ "count" : 3, "sex" : "male" }
{ "count" : 1, "sex" : "female" }

大體就是這樣,里面填的東西和find里是差不多的,

7.5 $sort

用法跟普通的用法一致,直接放栗子:

db.student.aggregate(
	{$group:{_id:"$sex",count:{$sum:1}}},
  {$sort:{age:1}}
)

{ "_id" : "female", "count" : 2 }
{ "_id" : "male", "count" : 3 }

如果前面的其他方法都看懂了,這個應該不成問題,就不解釋了,

7.6 $limit,skip

同樣跟前面很像,直接放例子:

db.student.aggregate(
	{$skip:2},{$limit:2}
)

{ "_id" : ObjectId("5e003f66f197cb08dc74a313"), "name" : "wangzirui", "age" : 22, "sex" : "male" }
{ "_id" : ObjectId("5e003f8ff197cb08dc74a314"), "name" : "zhuhuan", "age" : 22, "sex" : "female" }

不解釋了,

8.創建索引

for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}

在資料量特別龐大的時候,尋找資料就會變得慢一點,

所以要針對性的給集合建立索引

db.test.ensureIndex({name:1})

然后這個集合就有兩個索引了,之前那個索引叫_id,現在添加了一個域name也作為索引,

關于索引的幾個操作:

  • 創建唯一索引
    • db.test.ensureIndex({name:1},{uniqe:true})
  • 建立聯合索引
    • db.test.ensureIndex({name:1},{age:1})
  • 查看當前集合的索引
    • db.test.getIndexes()
  • 洗掉索引
    • db.t1.dropIndex("索引名")

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26226.html

標籤:NoSQL

上一篇:MongoDB(八):索引

下一篇:Hbase架構剖析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more