MongoDB 的安裝和基本操作
MongoDB 的安裝
使用 docker 安裝
下載鏡像:
docker pull mongo:4.4.8(推薦,下載指定版本)
docker pull mongo:latest (默認下載最新版本)
查看鏡像:
docker images
- 可以看到 mongo 已經下載好了
啟動鏡像:
docker run -d –restart=always -p 27017:27017 –name mymongo -v /data/db:/data/db mongo:4.4.8
- -d 後台運行
- –restart=always docker 容器啟動 mongo 也啟動 關閉也是如此
- -name 指定容器的名稱
- -v 和磁盤的的某個文件綁定起來
進入容器:
docker exec -it mymongo /bin/bash
進入到 mongo 的客戶端
mongo
MongoDB 概念解析
不管我們學習什麼數據庫都應該學習其中的基礎概念,在 mongodb 中基本的概念是文檔、集合、數據庫,下面我們詳細介紹,下表將幫助您更容易理解 Mongo 中的一些概念:
SQL 術語/概念 | MongoDB 術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB 不支持 | |
primary key | primary key | 主鍵,MongoDB 自動將_id 字段設置為主鍵 |
MongoDB 常用操作
(1)Help 查看命令提示
db.help();
(2)切換/創建數據庫
use test
如果數據庫不存在,則創建數據庫,否則切換到指定數據庫
(3) 查詢所有數據庫
show dbs;
(4)刪除當前使用數據庫
db.dropDatabase();
(5)查看當前使用的數據庫
db.getName();
(6)顯示當前 db 狀態
db.stats();
(7)當前 db 版本
db.version();
(8) 查看當前 db 的鏈接機器地址
db.getMongo();
常用指令:
我們先創建一個數據庫
use test
1 INSERT(新增)
插入到 User 集合中
db.User.save({name:’zhangsan’,age:21,sex:true})
查詢 User 集合中的所有文檔
db.User.find()
2 Remove(刪除)
remove()用於刪除單個或全部文檔,刪除後的文檔無法恢復
- 刪除所有:db.User.remove({})
- 指定 id 刪除:db.User.remove(id)
- 指定條件刪除:db.User.remove({‘name’:’zhangsan’})
3 UPDATE (修改)
- 第一個 { } 是條件
- 第二個大括號 是需要修改的內容
示例:db.User.update({name:”lucy”}, {$set:{age:100, sex:0}})
Update()有幾個參數需要注意。
db.collection.update(criteria, objNew, upsert, mult)
-
criteria:需要更新的條件表達式
-
objNew:更新表達式
-
upsert:如 FI 標記錄不存在,是否插入新文檔。
-
multi:是否更新多個文檔。
4 QUERY(查詢)
4.1 WHERE
在 mongo 中 我們該如何使用條件查詢呢?
語法 :db.User.find ({“filed”,值})
示例: db.User.find({name:”張三”})
轉換成 sql : select * form User where name = ‘張三’
4.2 FIELDS
在正常開發中,只需要查詢出一個集合中的某幾個字段即可?那麼這樣的業務我們該如何去實現呢?
- 第一個{}表示 什麼條件去查詢 就是上面的 where
- 第二個{}表示 需要查詢出的 field 值為 1
語法 :db.User.find ( { } , { “filed” , 值 })
示例:db.User.find( { name : “張三” } , { ‘name’ : 1 } )
轉換成 sql: select name from User where name = ‘張三’
5 SORT
在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。
示例:db.User.find().sort({‘age’:1})
轉換的 SQL :select * from User order by age desc
6 截取
在 MongoDB 中使用 limit()方法來讀取指定數量的數據,skip()方法表示從第幾行開始讀取
示例: db.User.find().skip(1).limit(2)
對應的 SQL: select * from User skip 1 limit 2
集合中的所有數據:一共兩條
第一行開始讀取 讀取到第二行結束
7 in(包含)
示例: db.User.find({age:{$in:[21,26,32]}})
轉換的 SQL:select * from User where age in (21, 26, 32)
8 COUNT(統計行數)
示例: select count(*) from User where age >20
轉換的 SQL: db.User.find({age:{$gt:20}}).count()
9 OR ( 或者)
age 是 20 或者 30 都滿足條件 類似於 |
示例: select * from User where age = 21 or age = 30
轉換的 SQL: db.User.find({$or:[{age:21}, {age:30}]})
10 aggregate(聚合)
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count(*)
插入測試數據
db.article.insert({title: ‘MongoDB Overview’,description: ‘MongoDB is no sql database’,by_user: ‘runoob.com’,url: ‘//www.runoob.com‘,tags: [‘mongodb’, ‘database’, ‘NoSQL’],likes: 100})
db.article.insert({title: ‘NoSQL Overview’,description: ‘No sql database is very fast’,by_user: ‘runoob.com’,url: ‘//www.runoob.com‘,tags: [‘mongodb’, ‘database’, ‘NoSQL’],likes: 10})
db.article.insert({title: ‘Neo4j Overview’,description: ‘Neo4j is no sql database’,by_user: ‘Neo4j’,url: ‘//www.neo4j.com‘,tags: [‘neo4j’, ‘database’, ‘NoSQL’],likes: 750})
常見的聚合表達式
表達式 | 描述 | 示例 |
---|---|---|
$sum | 計算總和 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) |
$avg | 平均值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) |
$min | 獲取集合中所有文檔對應值得最小值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) |
$max | 獲取集合中所有文檔對應值得最大值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) |
$push | 在結果文檔中插入值到一個數組中。 | db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$push: “$url”}}}]) |
$addToSet | 在結果文檔中插入值到一個數組中,但不創建副本。 | db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$addToSet : “$url”}}}]) |
$first | 根據資源文檔的排序獲取第一個文檔數據 | db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}]) |
$last | 根據資源文檔的排序獲取最後一個文檔數據 | db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}]) |
11 索引
索引通常能夠極大的提高
查詢的效率
,如果沒有索引,MongoDB在讀取數據時必須掃描集合中
的每個
文件並選取那些符合查詢條件的記錄。這種掃描全集合
的查詢效率是非常低
的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命
的。索引
是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列
的值進行排序的一種結構。
db.User.createIndex({“name”:1})
語法中 **name****值為你要創建的索引字段,
1** 為指定按升序創建索引,如果你想按降序來創建索引指定為 -1 即可