mongodb 基本操作 CRUD
一,mongodb 基本操作
創建數據庫
語法: use databaseName ,如果有該數據庫就切換到該數據庫。沒有則創建該數據庫
例子: use runoob , runoob 如果有這個數據庫就切換到這個數據庫,沒有則創建
輸出 > switched to db runoob
這個創建數據庫時直接使用 show dbs (查看數據庫)是看不到的,需要插入一些數據纔會看見
刪除數據庫
刪除數據庫時需要先切換到需要刪除的數據庫例:
> use runoob -切換到需要刪除的數據庫
switched to db runoob -輸出信息
> db.dropDatabase() -刪除數據庫,db表示當前數據庫,類似 this
{ "dropped" : "runoob", "ok" : 1 } -輸出信息
創建集合,刪除集合
在 mongodb 中不需要手動創建集合 ,在插入數據時mongodb會自動創建
> db.createCollection("student") -創建集合(不建議)
{ "ok" : 1 } -輸出信息
刪除集合
> db.student.drop() -刪除student 集合
> true -輸出信息
查看數據庫 and 集合
查看 數據庫
> show dbs -也可以寫 show databases 效果一樣
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
查看集合
> show collections -查看集合也支持 show tables (關係型數據庫的)
student
user
insert(添加)
語法:db.<collection>.insert(document)
// db:當前數據庫 emp:集合(如果有該集合就先集合中插入一條文檔,否則創建該集合) insert:插入語句
db.emp.insert({ -插入一個文檔
name : '小黑'
,sex : '男'
,age : '20'
});
db.emp.insert([ -插入多個文檔
{
name : '小白'
,sex : '女'
,age : '19'
}
,{
name : '小綠'
,sex : '女'
,age : '21'
}
]);
// mongodb 3.2添加了 insertOne(添加一個文檔) 和 insertMany(添加多個文檔)方法,使代碼更加語義化
db.emp.insertOne({ -插入一個文檔
name : '小黑'
,sex : '男'
,age : '20'
});
db.emp.insertMany([ -插入多個文檔
{
name : '小白'
,sex : '女'
,age : '19'
}
,{
name : '小綠'
,sex : '女'
,age : '21'
}
]);
PS:添加時每個文檔會自動添加一個 "_id" 來確保每個文檔的唯一性,當然我們也可以手動添加
例:
{
_id : 'hello'
,name : '小綠'
,sex : '女'
,age : '21'
}
手動添加的話也要確保每個id是唯一的
remove(刪除)
語法:
db.collection.remove(
<query>, - 刪除條件
{
justOne: <boolean>, - 是否刪除只匹配到的第一個文檔,默認false
writeConcern: <document> - 拋出異常級別
}
)
例子:
刪除全部
db.emp.remove({}); -() 裏面不能不寫 {} 一般也不會刪全部(直接刪集合不就好了嘛)
// 按照id刪除一個文檔
db.emp.remove('5ef9d5aece2f5819e31de72e'); -'5ef9d5aece2f5819e31de72e' 默認按照id刪除
// 按照名字刪除
db.emp.remove({name : '狗子'});
update(修改)
語法:
db.<collection>.update(
<query>, - 更新條件 類似於sql的while
<update>, - 更新內容
{
[upsert]:false, - 如果數據沒有是否插入,默認false
[multi]:false, - 是否更新按條件查詢出來的所有數據,默認爲false(只更新找到的第一條)
[writeConcern] - 拋出異常的級別
})
例子:
// 按照id更新一條數據
db.emp.update({
_id : ObjectId('5efaa5b887b4fd0ad4001662')
},{
sex : '公'
});
上面這種更新會直接使用 {sec : '公'} 把之前的給替換掉
也就是說我之前的文檔是
{
name : '小綠'
,sex : '女'
,age : '21'
}
會直接換成 {sec : '公'} 之前的 name 和 age 都會不見,如果想只更換裏面的一個的話需要這樣使用
db.emp.update(
{
name : '小xx'
},
{
$set:{
age:'20'
}
}
);
上面的會查找 到 name爲 小xx 的文檔,把裏面的age換成 20
$set 爲數據操作符,在最下方有一個表
find(查詢)
// db.<collection>.find([條件(json)])
// 查詢 emp 集合中所有文檔 返回一個數組
db.emp.find({name : '小xx'});
// 查詢emp集合中的所有文檔
db.emp.find();
// 根據id查詢
db.emp.find('5efaa5b887b4fd0ad4001662');
// 根據 性別 and 年齡查詢
db.emp.find({sex : '男' , age : '20'});
// PS 存入時與查詢時的數據類型要一致 age我之前存入的是string類型,條件直接這樣 age : 20 是查詢不到的
// 模糊查詢 可以使用 正則表達式
db.emp.find({name : /小+[\S]{1}/});
db.emp.find({name : /小\S/});
// 查詢集合中有多少條數據 返回 int -
db.emp.find().count();
// 在上面我們說 find 返回的是數組那麼就應該有length
db.emp.find().length();
// 如果查詢出來的數據絕不查看不方便 那麼可以使用pretty()方法格式化數據
db.emp.find().pretty();
數據操作符
名稱 | 用法 | 說明 |
---|---|---|
$inc | {$inc:{field:value}} | 對一個數字字段的某個field增加value(說白了就遞增多少) |
$set | {$set:{field:value}} | 把文檔中某個字段field的值設爲value |
$unset | {$unset:{field:1}} | 刪除某個字段field |
$push | {$push:{field:value}} | 把value追加到field裏。注:field只能是數組類型,如果field不存在,會自動插入一個數組類型 |
$pushAll | {$pushAll:{field:value_array}} | 用法同pushAll可以一次追加多個值到一個數組字段內。 |
$pullAll | {$pullAll:value_array} | 用法同$pull一樣,可以一次性刪除數組內的多個值。 |
$addToSet | {$addToSet:{field:value}} | 加一個值到數組內,而且只有當這個值在數組中不存在時才增加。 |
$pop | 刪除數組內第一個值:{KaTeX parse error: Expected 'EOF', got '}' at position 15: pop:{field:-1}}̲、刪除數組內最後一個值:{pop:{field:1}} | 用於刪除數組內的一個值 |
$pull | {$pull:{field:_value}} | 從數組field內刪除一個等於_value的值 |
$rename | {$rename:{old_field_name:new_field_name}} | 對字段進行重命名 |