MongoDB 數據庫 基礎操作(一)

一、 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

  1. cmd開啓,開啓之後這個cmd窗口就相當於一個服務端程序,你不能關閉,關閉之後數據庫就關閉了。
  2. 進行配置,讓數據庫的自動運行

客戶端:相當於連接數據庫的窗口,連接好之後,就可以進行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 刪除數據中的某一列

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}}])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章