1. 程式人生 > 其它 >MongoDB資料庫,集合,文件查詢

MongoDB資料庫,集合,文件查詢

技術標籤:軟體測試相關mongodb

MongoDB資料庫,集合文件查詢

資料庫相關操作

顯示所有資料庫

show dbs;

建立,連線資料庫

use database_name;

顯示當前連線的資料庫

db;

刪除資料庫

db.dropDatabase();->注意這裡是刪除的當前連線的資料庫

集合相關操作

顯示當前資料庫下所有集合

show collections;

建立集合

  1. 隱式建立

在這裡插入圖片描述

注意隱式建立集合的時候insert()括號裡不能為空,否則報錯
  1. 顯示建立

在這裡插入圖片描述

刪除集合

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"});//刪多條