一、 MongoDB簡介
MongoDB:文檔數據庫,存儲的是Bson格式文檔(Bson是json的二進制化)。{name:'haha',age:9}
特點::內部執行引擎爲JS解釋器, 把文檔存儲成bson結構,在查詢時,轉換爲JS對象,並可以通過熟悉的js語法來操作.
- mongodb數據庫bin目錄下的文件意義
二、 mongo和傳統型數據庫的區別
- 傳統型數據庫: 結構化數據, 定好了表結構後,每一行的內容,必是符合表結構的,就是說列的個數,類型都一樣.
- mongo文檔型數據庫: 集合中存儲的每篇文檔,都可以有自己獨特的結構
(json對象都可以有自己獨特的屬性和值) - mongo數據庫的collection不用提前創建(可以使用時自動創建)。關係型數據庫的表必須提前創建
三、 MongoDB服務端與客戶端
1、安裝之後先建文件夾
2、啓動
服務端:相當於啓動這個數據庫,比如啓動mongo,mysql,啓動之後,你才能進行CRUD操作。
- 服務端開啓方法:
mongod --dbpath D:\ProgramData\MongoDB\Server\3.4\data\db
--dbpath後跟的是上面創建的數據庫存儲的目錄
出現下圖①所示表示啓動成功,若想和②一樣在根目錄下啓動需要配置環境變量
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200410211749994.png
- cmd開啓,開啓之後這個cmd窗口就相當於一個服務端程序,你不能關閉,關閉之後數據庫就關閉了。
- 進行配置,讓數據庫的自動運行
客戶端:相當於連接數據庫的窗口,連接好之後,就可以進行CRUD操作。
CRUD :
crud是指在做計算處理時的
增加(Create)
讀取(Retrieve)
更新(Update)
刪除(Delete)
幾個單詞的首字母簡寫。
crud主要被用在描述軟件系統中數據庫或者持久層的基本操作功能
四、常用命令
show dbs //查看當前的數據庫
use dbname //選擇使用的庫,Mongodb的庫是隱式創建,如果use一個不存在的庫,再在該庫下創建表格,即可創建庫
show collections/show tables //查看當前庫下的表格
db.createCollection(‘collectionName’) //創建集合
db.collectionName.insert({name:'haha'}) //插入一條數據亦可以隱式創建集合
db.collectionName.drop() //刪除集合,數據庫中的集合都刪除之後,數據庫會自動刪除
db.dropDatabase() //刪除數據庫
五、增刪改查
1.增 insert
-
增加單個文檔
db.表名.insert({name:’hehe’})
-
增加單個文檔,並指定_id
db.表名.insert({_id:8,age:22,name:’zs’})
-
增加多個文檔
db.python.insert([{_id:2,name:'lisi',age:18},{name:'ww',age:22,hobby:'sing'}])
2、刪除 remove
-
語法
db.表名.remove(查詢表達式, 選項) 選項是指 {justOne:true/false},是否只刪一行, 默認爲false
-
注意
1、查詢表達式依然是個json對象{age:20} 2、查詢表達式匹配的行將被刪除 3、如果不寫查詢表達式,表中的所有文檔將被刪除
-
實例
例1、刪除sub表中的name屬性值爲‘語文’的文檔 db.sub.remove({name:'語文'}) 例2、刪除python表中name屬性爲‘bb’的文檔,只刪除一行 db.python.remove({name:'bb'},{justOne:true})
3、更新 update
-
語法
db.collection.update(查詢表達式,新值,選項) 如果新值這裏放的一條文檔,結果是新文檔替換舊文檔,而不是更新字段,見下圖 所以更新操作需要配合更新表達式: $set 修改某列的值;如果新值更新的字段不存在,就會在該條數據後插入新值的字段 $unset 刪除某個列 $rename 重命名某個列 $inc 增長某個列 選項有兩個參數{upsert:true/false,multi:true/false} upsert:默認false,如果值爲true的話,查詢表達式未找到該條數據,則直接插入該行 multi: 是指修改多行(即使查詢表達式命中多行,默認false,只改1行,如果想改多行,用true)
- $set和選項中的upsert 修改某列的值;或者是給該條數據添加新字段
- $unset 刪除數據中的某一列
- $rename 重命名某列的名稱
- $inc和選項中的multi : 增長某列的值,multi爲true是修改查詢出的多行,爲false的話是修改一行
4、find 查詢
- 語法:db.collection.find(查詢表達式,查詢的列)
查詢的列:{列名:1,列名2:0}
0表示不顯示,1表示顯示
> db.demo.find() //什麼都不寫,默認查詢全部並顯示
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 3, "age" : 43, "newname" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 6, "name" : "aaa", "age" : 71 }
> db.demo.find({},{_id:0,name:1,age:1}) //_id字段默認顯示,所以改爲0,讓name和age字段顯示
{ "age" : 22, "name" : "bbb" }
{ "age" : 43 }
{ "name" : "ddd", "age" : 44 }
{ "name" : "eee", "age" : 60 }
{ "name" : "aaa", "age" : 71 }
> db.demo.find({_id:2,name:'bbb'},{_id:1,name:1,age:1}) //查詢_id爲2並且name爲bbb的數據,並顯示name和age字段
{ "_id" : 2, "age" : 22, "name" : "bbb" }
-
常用方法
limit() 限制輸出條數 skip() 跳過幾條數據 sort() 將數據排序(-1逆序輸出,1正序輸出) count() 計數
> db.demo.find() //查詢所有的數據
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 6, "name" : "aaa", "age" : 71 }
> db.demo.find().limit(3) //限制輸出3條數據
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
> db.demo.find().skip(2).limit(2) //跳過2條數據,並限制輸出2條數據,可以實現分頁功能
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
> db.demo.find().sort({age:-1}) //將age字段逆序輸出
{ "_id" : 6, "name" : "aaa", "age" : 71 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
> db.demo.find().sort({name:1}) //將name字段正序輸出
{ "_id" : 6, "name" : "aaa", "age" : 71 }
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
> db.demo.find().count() //對查詢的數據計數
5
> db.demo.find({_id:{$gt:3}}).count() //查詢_id的值大於3的數據的數量
3
查詢表達式
$lt 小於
$lte 小於等於
$gt 大於
$gte 大於等於
$ne 不等於
$nin 查詢不在某個數組中的文檔(not in)
$all 查詢包含某個給定數組中所有項的文檔
$in 查詢包含某個給定數組中某一項的文檔
$exists 查詢出包含某個字段的文檔
$nor 返回所有條件都不滿足的文檔 {$nor:[條件1,條件2,...]}
$and 返回所有條件都滿足的文檔 {$and:[條件1,條件2,...]}
$or 返回滿足任何一個條件的文檔 {$or:[條件1,條件2,...]}
> db.demo.find()
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 6, "name" : "aaa", "age" : 71 }
> db.demo.find({_id:{'$ne':3}}) //查詢_id不等於3的數據
{ "_id" : 2, "age" : 22, "hobby" : "dance", "name" : "bbb" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 6, "name" : "aaa", "age" : 71 }
> db.demo.find({_id:{'$gte':3}}) //查詢_id大於等於3的數據
{ "_id" : 3, "age" : 43, "name" : "ccc" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
{ "_id" : 6, "name" : "aaa", "age" : 71 }
> db.demo.find({_id:{'$nin':[2,3,6]}}) //查詢_id不在2,3,6中的數據
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60 }
//此處代碼和上面分開
> db.demo.find()
{ "_id" : 2, "age" : 22, "hobby" : [ "b", "c", "d" ], "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc", "hobby" : [ "b", "c", "d" ] }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60, "hobby" : [ "a", "b", "c" ] }
{ "_id" : 6, "name" : "aaa", "age" : 71, "hobby" : [ "a", "b", "c" ] }
> db.demo.find({hobby:{$all:['a','c']}}) //查詢愛好包含a和c的數據
{ "_id" : 5, "name" : "eee", "age" : 60, "hobby" : [ "a", "b", "c" ] }
{ "_id" : 6, "name" : "aaa", "age" : 71, "hobby" : [ "a", "b", "c" ] }
> db.demo.find({hobby:{$in:['a','c']}}) //查詢愛好包含a或c的數據
{ "_id" : 2, "age" : 22, "hobby" : [ "b", "c", "d" ], "name" : "bbb" }
{ "_id" : 3, "age" : 43, "name" : "ccc", "hobby" : [ "b", "c", "d" ] }
{ "_id" : 5, "name" : "eee", "age" : 60, "hobby" : [ "a", "b", "c" ] }
{ "_id" : 6, "name" : "aaa", "age" : 71, "hobby" : [ "a", "b", "c" ] }
> db.demo.find({hobby:{$exists:0}}) //值爲0查詢不包含hobby字段的文檔,爲1的話就是包含hobby字段的文檔
{ "_id" : 4, "name" : "ddd", "age" : 44 }
> db.demo.find({$nor:[{_id:{$gt:3}},{age:{$lt:40}}]}) //查詢_id不大於3並且age不小於40的
{ "_id" : 3, "age" : 43, "name" : "ccc", "hobby" : [ "b", "c", "d" ] }
> db.demo.find({$and:[{_id:{$gt:3}},{age:{$lt:61}}]}) //s查詢_id大於3並且age小於61的
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60, "hobby" : [ "a", "b", "c" ] }
> db.demo.find({$or:[{_id:{$gt:3}},{age:{$lt:40}}]}) //查詢_id大於3或者age小於40的
{ "_id" : 2, "age" : 22, "hobby" : [ "b", "c", "d" ], "name" : "bbb" }
{ "_id" : 4, "name" : "ddd", "age" : 44 }
{ "_id" : 5, "name" : "eee", "age" : 60, "hobby" : [ "a", "b", "c" ] }
{ "_id" : 6, "name" : "aaa", "age" : 71, "hobby" : [ "a", "b", "c" ] }
5、聚合查詢 aggregate
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結 果。有點類似sql語句中的 count(*)。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理,管道操作是 可以重複的
-
語法
db.COLLECTION_NAME.aggregate([{管道1},{管道2},{管道3}, ... ]) 常用管道操作 $match:用於過濾數據,只輸出符合條件的文檔。*** $limit:用來限制MongoDB聚合管道返回的文檔數。 $skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。 $group:將集合中的文檔分組,可用於統計結果。** $sort:將輸入文檔排序後輸出 group中的一下操作表達式: $sum 計算總和 $avg 計算平均值 $min 獲取集合中所有文檔對應值的最小值。 $max 獲取集合中所有文檔對應值的最大值。 $first 根據文檔的排序獲取第一個文檔 $last 根據文檔的排序獲取最後一個文檔
-
練習
1. 查詢每個欄目下的商品數量(必須以_id命名,$cat_id意思是以cat_id這一列分組)
> db.goods.aggregate([{$group:{_id:'$cat_id',t:{$sum:1}}}])
{ "_id" : 14, "t" : 2 }
{ "_id" : 2, "t" : 1 }
{ "_id" : 13, "t" : 2 }
{ "_id" : 3, "t" : 15 }
{ "_id" : 11, "t" : 2 }
{ "_id" : 8, "t" : 3 }
{ "_id" : 4, "t" : 3 }
{ "_id" : 5, "t" : 1 }
{ "_id" : 15, "t" : 2 }
2、查詢goods下有多少條商品(null就是不以某一列分組)
> db.goods.aggregate([{$group:{_id:null,t:{$sum:1}}}])
{ "_id" : null, "t" : 31 }
3、查詢每個欄目下價格大於50元的商品個數
> db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',t:{$sum:1}}}])
{ "_id" : 14, "t" : 1 }
{ "_id" : 2, "t" : 1 }
{ "_id" : 3, "t" : 15 }
{ "_id" : 8, "t" : 3 }
{ "_id" : 15, "t" : 1 }
{ "_id" : 5, "t" : 1 }
{ "_id" : 4, "t" : 3 }
4、查詢每個欄目下的庫存量
> db.goods.aggregate([{$group:{_id:'$cat_id',t:{$sum:'$goods_number'}}}])
{ "_id" : 14, "t" : 9 }
{ "_id" : 2, "t" : 0 }
{ "_id" : 13, "t" : 4 }
{ "_id" : 3, "t" : 203 }
{ "_id" : 11, "t" : 23 }
{ "_id" : 8, "t" : 61 }
{ "_id" : 4, "t" : 3 }
{ "_id" : 5, "t" : 8 }
{ "_id" : 15, "t" : 2 }
5、查詢每個欄目下價格大於50元的商品個數 ,並篩選出滿足條件的商品個數大於等於3的欄目
> db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',t:{$sum:1}}},{$match:{t:{$gte:3}}}])
{ "_id" : 3, "t" : 15 }
{ "_id" : 8, "t" : 3 }
{ "_id" : 4, "t" : 3 }
6、查詢每個欄目下的庫存量,並按庫存量排序(1是正序,‐1是逆序)
db.goods.aggregate([{$group:{_id:"$cat_id" , total: {$sum:"$goods_number"}}}, {$sort:{total:1}}])
7.查詢每個欄目的商品平均價格,並按平均價格由高到低排序
db.goods.aggregate([{$group:{_id:"$cat_id",avg:{$avg:"$shop_price"}}},{$s ort:{avg:‐1}}])