MongoDB資料庫,集合,文件查詢
MongoDB資料庫,集合文件查詢
資料庫相關操作
顯示所有資料庫
show dbs;
建立,連線資料庫
use database_name;
顯示當前連線的資料庫
db;
刪除資料庫
db.dropDatabase();->注意這裡是刪除的當前連線的資料庫
集合相關操作
顯示當前資料庫下所有集合
show collections;
建立集合
- 隱式建立
注意隱式建立集合的時候insert()括號裡不能為空,否則報錯
- 顯示建立
刪除集合
db.a.drop();->刪除集合a
文件相關操作
文件查詢
查詢所有欄位資訊
db.a.find();
查詢特定欄位資訊
db.a.find({item:'電影票'},{name:1,price:1,_id:0});
/*這裡第一個{}表示查詢的條件,比如查詢某個欄位下的某個內容
第二個{}表示你想要顯示的欄位,'1'表示顯示,'0'表示不顯示
上面指令的意思就是查詢欄位為item下的所有電影票文件,只顯示name和price欄位,不顯示_id欄位(如果不寫_id,系統會預設自己顯示)*/
db.a.find({},{name:0,price:0});
/*第一個{}為空表示查詢所有文件,第二個{}裡面name,price欄位為0,表示除了這2個欄位不顯示,其他都顯示*/
find()如果跟2個引數,那麼每個引數都是文件型別
第一個引數表示查詢條件
第二個引數表示顯示的內容
排序顯示
單欄位排序
db.a.find().sort({price:1});
表示以價格升序排序
1代表升序,-1代表降序
多欄位排序
db.a.find().sort({price:1,stocks:-1});
表示以價格升序,庫存量降序
注意:這裡有前後之分,要先按price排序,再按stocks排序,且stocks的降序是建立在price升序之上,也就是說當price排序完有重複的文件時,才會按stocks降序
空值查詢
比如現在有這樣的一個情景,我在a中插入3個文件,
第一個文件欄位item為空值
第二個文件直接沒有item這個欄位
第三個文件有item欄位,且裡面還有個值
db.a.insert([
{_id:1,item:null},
{_id:2},
{_id:3,item:'computer'}
]);
1.現在我要查詢item為null的文件,可以如下:
db.a.find({item:{$type:10}});
10在MongoDB中代表null值
2.我要查詢沒有item這個欄位的文件,可以如下:
db.a.find({item:{$exists:false}});
使用操作符$exists
false表示沒有該欄位,true表示有
分組統計
使用聚合函式aggregate()和操作符$group
沒有額外條件的分組
如:將商品按item分組,統計各組庫存量的和
db.a.aggregate(
{$group:{_id:"$item",total:{$sum:"$stocks"}}}
);
_id:後面接你要分組的欄位
total是隨便起的一個名字(和),並不是格式要求
$sum:"stocks"表示對庫存量stocks求和
有其他條件的分組
需要使用操作符**$match**
什麼叫有其他條件,比如說上面那個例子,
我再在此基礎上,還要統計出價格在50到80之間的文件,如下:
db.a.aggregate(
{$match:{price:{$lte:80,$gte:50}}},
{$group:{_id:"$item",total:{$sum:"$stocks"}}}
);
注意這裡的格式
第一個{}表示匹配的條件(也就是分組後的條件),
第二個{}表示分組的條件
特別注意:
當$sum後面求和的欄位其型別為整型時,很容易理解,就是將其中的數值求和就行了
當$sum後面求和的欄位是字元型時,我們可以寫一個1,表示以1為計量單位,對這條文件的這個欄位下的內容計數
如:
db.a.aggregate(
{$group:{_id:"$item",total:{$sum:1}}}
);
文件陣列查詢
文件陣列,就是一個數組,裡面的元素都是文件型別
比如有一個欄位test,該欄位下的內容就是文件陣列
第一種查詢方法:
db.a.find({test:{name:'A',price:25}});
這種查詢指查詢test欄位中文件數組裡某個元素為{name:‘A’,price:25}的文件,{name:‘A’,price:25}的內容要完全一致,順序不能變
第二種查詢方法:
db.a.find({test:{$elemMatch:{name:'A',price:25}}});
這一次加了操作符$elemMatch,表示只要該文件數組裡有這個元素就行,不管順序如何(name和price這2個鍵還是要有的)
查詢某個文件的文件數組裡的某個元素的某個欄位
(有點繞…)
意思就是比如說我現在要求顯示test裡的第一個元素的price:
db.a.find({},{"test.0.price":1,_id:0});
不管是第幾個元素,顯示所有元素的price:
db.a.find({},{"test.price":1,_id:0});
注意:內嵌文件,陣列元素,都需要放在引號內
文件更新
update() 更新一個文件
updateMany() 更新多個或所有文件
該函式通常跟2個引數,
第一個引數為要更新的欄位
第二個引數為要更新的條件
$set
更新,新建欄位
更新一個文件
db.a.update({item:'paper'},{$set:{price:15}});
注意:如果這裡不加$set,那麼會將該文件的所有欄位全改為price!
更新多個文件
db.a.updateMany({},{$set:{price:20}});
將所有文件的price改為20
這2個地方的$set都有兩重含義:
1.如果有該欄位(price),那麼直接將其更新
2.如果沒有該欄位(price),那麼會先建立該欄位,也就是新加欄位,然後賦予其初始值
$unset
刪除欄位
db.a.updateMany({},{$unset:{price:1}});
1表示刪除欄位price,或者用“”代替(引號裡什麼也沒有)
$inc
db.a.updateMany({},{$inc:{price:5}});
表示所有價格上漲5,改為-5表示下降
文件刪除
deleteOne() 刪一條文件
deleteMany() 刪多條或全部文件
db.a.deleteOne({item:"movie"});//刪一條
db.a.deleteMany({item:"movie"});//刪多條