MongoDB數據庫(一)--基本操作,增刪改查,聚合操作,遊標

非關係型數據庫

在這裏插入圖片描述

MongoDB

在這裏插入圖片描述

新建的默認有兩個數據庫

admin–配置權限

local–固定的重要數據

一、基本操作

查看數據庫

show dbs

創建數據庫(隱式創建)

在這裏插入圖片描述
沒有成功,需要兩步
在這裏插入圖片描述
還可以
在這裏插入圖片描述

查看集合

show tables
show collections

在這裏插入圖片描述

刪除庫和集合

db.collectionName.drop()    // 刪除集合
db.dropDatabase()    // 刪除數據庫

庫內沒有集合了,庫也會自動刪除
在這裏插入圖片描述
在這裏插入圖片描述

二、增刪改查

(一)增:insert方法

MongoDB存儲的時文檔,文檔其實就是json格式的對象。

增加單條數據
在這裏插入圖片描述

增加多條數據
在這裏插入圖片描述

(二)刪:remove方法

語法

db.collection.remove(查詢表達式, 選項)

選項

{justOne:true/false},是否只刪一行,默認爲false

注意

  1. 查詢表達式依然是個json對象{age:20}
  2. 查詢表達式匹配的行,將被刪除
  3. 如果不寫查看錶達式,collection中的所有文檔 將被刪除

例1:刪除stu表中 sn屬性值爲’001’的文檔

db.stu.remove({sn:’001’})

例2: 刪除stu表中gender屬性爲m的文檔,只刪除1行

db.stu.remove({gender:’m’,true});

判斷符
name:‘zhangsan’ 相等
$gt:10 大於
$lt:10 小於
$gte:10 大於等於
$lte:10 小於等於
$ne:10 不等於
$nin:[1,2] 不在
$in:[1,2]
$and:[條件1,條件2] 並且
$or:[條件1,條件2]

練習

1.刪除name爲’tiantian’的數據
在這裏插入圖片描述

2.刪除age大於12的數據

在這裏插入圖片描述

3.刪除age小於11的數據

在這裏插入圖片描述

4.刪除age不等於11的數據

在這裏插入圖片描述

(三)改:update方法

語法

db.collection.update(查詢表達式,新值,選項)

注意

如果使用下面語句,不是更新數據,而是更新文檔。更新就是用新文檔替換舊文檔。

在這裏插入圖片描述

$set–修改某列的值

在這裏插入圖片描述
$unset–刪除某個列
在這裏插入圖片描述

$rename–重命名某個列
在這裏插入圖片描述

$inc–增加某個列
在這裏插入圖片描述

選項

{upsert:true/false,multi:true/false}

upsert:true/false:默認爲false,爲true時,不存在則插入,如果存在就更新。
在這裏插入圖片描述

multi:true/false默認爲false,爲true時,會更新匹配到的所有數據。

在這裏插入圖片描述

(四)查:find方法

語法

db.collection.find(查詢表達式,查詢的列)

$nin–>not in
在這裏插入圖片描述

_id:只有在指定不顯示,纔會沒有,不寫默認都是顯示的

其他列,不指定都不顯示。

$all–指數組所有單元匹配,就是指指定的內容都要有,通過一個list指定
在這裏插入圖片描述

$exists–是否含有某個列

1–存在

0–不存在
在這裏插入圖片描述
count()–計算查詢結果的數量
在這裏插入圖片描述

limit()–查看指定數量的結果
在這裏插入圖片描述
skip()–跳過指定數目
在這裏插入圖片描述
skip()和limit()配合使用可以製作分頁。

練習

1.主鍵爲32的商品
在這裏插入圖片描述
2.不屬第3欄目的所有商品($ne)
在這裏插入圖片描述

3.本店價格高於3000元的商品{$gt}
在這裏插入圖片描述

4.取出第4欄目或第11欄目的商品($in)

db.goods.find({cat_id:{$in:[4,11]}},{cat_id:1,goods_name:1})

在這裏插入圖片描述
5.取出100<=價格<=500的商品($and)

db.goods.find({$and:[{shop_price:{$gte:100}},{shop_price:{$lte:500}}]},{shop_price:1,goods_name:1})

在這裏插入圖片描述
6.取出不屬於第3欄目且不屬於第11欄目的商品($and ninnin和nor分別實現)

db.goods.find({$and:[{cat_id:{$ne:3}},{cat_id:{$ne:11}}]},{goods_name:1,cat_id:1})

在這裏插入圖片描述

db.goods.find({cat_id:{$nin:[3,11]}},{goods_name:1,cat_id:1})

在這裏插入圖片描述

db.goods.find({$nor:[{cat_id:3},{cat_id:11}]},{goods_name:1,cat_id:1})

在這裏插入圖片描述

7.取出價格大於100且小於300或者大於4000且小於5000的商品

db.goods.find({$or:[{$and:[{shop_price:{$gt:100}},{shop_price:{$lt:300}}]},{$and:[{shop_price:{$gt:4000}},{shop_price:{$lt:5000}}]}]},{goods_name:1,shop_price:1})

在這裏插入圖片描述

8.取出goods_id%5 == 1, 即,1,6,11,…這樣的商品

db.goods.find({goods_id:{$mod:[5,1]}},{goods_id:1,goods_name:1})

在這裏插入圖片描述

三、聚合操作

語法

db.COLLECTION_NAME.aggregate( [ {管道1}, {管道2}, {管道3}, … ] )

MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理,管道操作是可以重複的。

常用的管道操作
$project 修改輸入文檔的結構。可以用來重命名、增加或修改域,也可以用於創建計算結果以及嵌套文檔。
$match 用於過濾數據,只輸出符合條件的文檔。使用MongoDB的標準查詢操作。
$limit 用來限制MongoDB聚合管道返回的文檔數。
$skip 在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
$group 將集合中的文檔分組,可用於統計結果。
$sort 將輸入文檔排序後輸出。

group中的操作表達式

表達式 描述
$sum 計算總和。
$avg 計算平均值
$min 獲取集合中所有文檔對應值得最小值。
$max 獲取集合中所有文檔對應值得最大值。
$first 根據資源文檔的排序獲取第一個文檔數據。
$last 根據資源文檔的排序獲取最後一個文檔數據

練習

1.查詢每個欄目下的商品數量

db.goods.aggregate([{$group:{_id:'$cat_id',total:{$sum:1}}}])

在這裏插入圖片描述

2.查詢goods中有多少條商品

db.goods.aggregate([{$group:{_id:null,total:{$sum:1}}}])
或
db.goods.find().count()

在這裏插入圖片描述
3.查詢每個欄目下價格大於50元的商品個數

思路:

(1)找出價格大於50元的商品

(2)以cat_id分組,求sum

db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',sum:{$sum:1}}}])

在這裏插入圖片描述

4.查詢每個欄目下的庫存量(商品數量)

db.goods.aggregate([{$group:{_id:"$cat_id",goods_total:{$sum:'$goods_number'}}}])

在這裏插入圖片描述

5.查詢每個欄目下,價格大於50的商品個數,並篩選出商品個數大於3的欄目

思路:

(1)查找價格大於50的商品

(2)以cat_id分組,求出每組的商品個數

(3)篩選出商品個數爲3的

db.goods.aggregate([{$match:{shop_price:{$gt:50}}},{$group:{_id:'$cat_id',total:{$sum:1}}},{$match:{total:{$gt:3}}}])

在這裏插入圖片描述

6.查詢每個欄目的商品平均價格,並按照平均價格由高到低排序

{$sort:{total:1}}:按total這個列排序,1表示升序,-1表示降序

思路:

(1)以cat_id分組,求出組內商品的平均價格

(2)按照平均價格降序排列

db.goods.aggregate([{$group:{_id:"$cat_id",avg_price:{$avg:"$shop_price"}}},{$sort:{avg_price:-1}}])

在這裏插入圖片描述

四、遊標

我們查詢時使用的db.collectionName.find()方法,會將所有的數據都查詢出來。

python中,有生成器,每次給我們返回一條數據,MongoDB中,有遊標與它類似。

定義

通俗的說遊標不是查詢結果,而是查詢的返回資源或者接口,就像python中的生成器那樣,可以一次一次的獲取每一個資源。

聲明

var cursor_name = db.collectionName.find()

操作

cursor.hasNext()    //判斷遊標是否已經取到盡頭
cursor.next()    // 取出遊標的下一個單元
cursor.toArray()    //看到所有行
cursor.toArray()[2]    //看到第二行
注意不要使用toArray()方法,原因是會把所有的行立即以對象的形式放在內存中,這樣就失去了使用遊標的意義,造成了資源浪費,可以在取出少數的幾行時使用。

練習

使用while循環打印遊標結果
在這裏插入圖片描述

cursor.forEach()回調函數

var func = function(obj){print(obj.goods_name)}
var cursor = db.goods.find().skip(10).limit(10)
cursor.forEach(func)

在這裏插入圖片描述

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