非關係型數據庫
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
注意:
- 查詢表達式依然是個json對象{age:20}
- 查詢表達式匹配的行,將被刪除
- 如果不寫查看錶達式,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 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)