本文簡單介紹了 mongodb 數據庫的基本概念以及基礎用法
一、簡介
MongoDB
是爲快速開發互聯網Web
應用而設計的數據庫系統MongoDB
的設計目標是極簡、靈活、作爲Web
應用棧的一部分MongoDB
的數據模型是面向文檔的,所謂文檔,是一種類似於JSON
的結構,簡單理解MongoDB
這個數據庫中存的是各種各樣的JSON(BJSON)
二、相關概念及名詞
-
數據庫:是一個倉庫,在倉庫中可以存放集合
-
集合
- 類似於數組,在集合中可以存放文檔
- 存儲的文檔可以是多種多樣的,沒有格式要求
-
文檔
- 數據庫中的最小單位,對數據庫進行存儲和操作的內容都是文檔
- 類似於
JS
中的對象,在MongoDB
中每一條數據就是一個文檔
多個文檔組成集合,多個集合組成數據庫
三、常用指令
基本指令
show dbs/ databases
: 顯示當前的所有數據庫use
數據庫名:進入到指定的數據庫中eg: use my_test
db
:表示的是當前所處的數據庫show collections
:顯示數據庫中所有的集合
增刪改查(CRUD)指令
新增(INSERT)
- 向數據庫中插入文檔:
db.<collection>.insert(doc)
- 向集合中插入一個或多個文檔
- 向集合中插入文檔時,如果沒有給文檔指定
id
屬性,則數據庫會自動爲文檔添加_id
,該屬性用來作爲文檔的唯一標識 _id
我們可以自己指定,如果我們指定了,則數據庫就不會再自動生成了。如果自己指定_id
,也必須確保它的唯一性- 例子:向
test
數據庫中的students
集合中插入一個新的學生對象:{name: "小明", age: 18, addr: "male"}
use test; db.students.insert({name: "小明", age: 18, addr: "三味書屋"});
db.<collection>.insertOne(doc)
:向數據庫中插入一條數據db.<collection>.insertMany(doc)
:向數據庫中插入多條數據
示例:
use test;
// 插入一條
db.students.insert({name: "小明", age: 18, addr: "三味書屋", salary: 3000});
// 插入多條
db.students.insert([{name: "小紅", age: 16, addr: "東方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);
// 等同於下面的方式
// 插入一條
db.students.insertOne({name: "小明", age: 18, addr: "三味書屋", salary: 3000});
// 插入多條
db.students.insertMany([{name: "小紅", age: 16, addr: "東方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);
查詢(QUERY)
db.<collection>.find()
- 默認查詢當前集合中的所有文檔
find({})
:也是查詢當前集合中所有的文檔- 返回的是一個數組
- 接收一個對象作爲參數,必須滿足對象中所有的屬性
.count()
: 查詢出所有結果的數量.length()
: 查詢出所有結果的數量
db.<collection>.findOne()
:查詢集合中符合條件的第一個文檔- 返回的是一個對象
use test
// 查詢集合中所有的文檔(實際項目中不會這麼操作)
db.students.find();
// 查詢集合中符合條件的所有文檔
db.students.find({ age: 19 });
// 查詢符合條件的第一個文檔
db.students.findOne({ age: 19 });
// 查詢符合條件的文檔數目
db.students.find({ age: 19 }).count();
// 或
db.students.find({ age: 19 }).length();
投影
db.<collection>.find(filter, options)
filter
:查詢條件對象options
: 投影條件對象,需要展示的屬性設置爲 1,不需要展示的屬性設置爲 0
.limit(num)
:顯示多少個文檔.skip(num)
:跳過多少個文檔.sort({ key1: 1, key2: -1 })
:按照key1
正序排列,排完之後再按照key2
倒序排列
示例
use test;
// 查詢 students 集合中所有對象,只展示 age 字段
db.students.find({}, { age: 1 });
// 查詢 students 集合中所有對象,不展示 age 字段
db.students.find({}, { age: 0 });
// 查詢 students 集合,只展示符合條件的前 2 條數據
db.students.find({}).limit(2);
// 查詢 students 集合中所有對象,跳過前 2 條數據
db.students.find({}).skip(2);
// 查詢 students 集合中所有對象,按 age 正序排列
db.students.find({}).sort({ age: 1 });
// 查詢 students 集合中所有對象,按 age 倒序排列
db.students.find({}).sort({ age: -1 });
常用查詢器
$gt
:大於$gte
:大於等於$eq
:等於$lt
:小於$lte
:小於等於$or
:或者
之前查詢不使用任何查詢器時,條件的判斷是包含,不是相等
示例:
// 工資大於 3000
db.students.find({salary: { $gt: 3000 }});
// 工資大於等於 3000
db.students.find({salary: { $gte: 3000 }});
// 工資等於 3000
db.students.find({salary: { $eq: 3000 }});
// 工資小於 6000
db.students.find({salary: { $lt: 6000 }});
// 工資小於等於 6000
db.students.find({salary: { $lte: 6000 }});
// 工資大於 3000 且小於 6000
db.students.find({salary: { $gt: 3000, $lt: 6000 }});
// 工資是 3000 或者 名字是 小白
db.students.find({$or: [ {salary: 3000}, {name: "小白"} ]});
更新(UPDATE)
db.<collection>.update(查詢條件, 新對象, [options])
options
: 配置對象upsert: <boolean>
multi: <boolean>
是否跟新多條,默認是 falsewriteConcern: <document>
collation: <document>
update()
默認情況下會使用新對象來替換舊的對象- 如果需要修改指定的屬性,而不是替換,則需要使用 “修改操作符” 來完成
$set
: 修改操作符,修改屬性值。$unset
: 修改操作符,刪除屬性值。- db..update({ name: “zgd” }, {$set: { age: 21 }})
- 默認情況下只會更新匹配到的第一個文檔對象
- db..updateOne(查詢條件, 新對象):修改第一個符合條件的文檔
- db..updateMany(查詢條件, 新對象):同時修改多個符合條件的文檔
- db..replaceOne(查詢條件, 新對象):替換一個文檔
示例
use test
// 修改一條數據
db.students.update({name: '小明'}, {$set: { age: 19 }});
// 等同於 updateOne
db.students.updateOne({name: '小明'}, {$set: { age: 19 }});
// 修改多條數據
db.students.update({age: 19}, {$set: { addr: '水月洞天' }}, { multi: true });
// 等同於 updateMany
db.students.updateMany({age: 19}, {$set: { addr: '水月洞天' }});
// 數據替換
db.students.update({age: 16}, { name: '小花', age: 14, addr: '迪士尼樂園' });
// 等同於 replaceOne
db.students.replaceOne({age: 16}, { name: '小花', age: 14, addr: '迪士尼樂園' });
常用修改器:
$set
: 設置屬性$unset
:刪除屬性$push
:向數組中添加一條數據$addToSet
:向數組中添加一條數據,與$push
的區別:若數據已存在,則不再添加$inc
(只能用於 Number 類型的值):用來增加已有屬性的值,若屬性不存在,則創建該屬性
// 修改 addr 屬性
db.students.updateMany({age: 19}, { $set: { addr: '花果山' } });
// 爲小花刪除 age 屬性
db.students.updateOne({name: '小花' }, { $unset: { age: '' } });
// 先爲小明添加一個 hobby 屬性,其中有一個 cities 屬性是一個數組
db.students.updateOne({name: '小明' }, { $set: { hobby: { cities: '北京', '上海' } } });
// 爲小明的 cities 屬性 添加一個 '杭州',可以通過 . 操作符爲下級屬性賦值,但是必須用 "" 引號包裹起來
db.students.updateOne({name: '小明' }, { $push: { "hobby.cities": '杭州' } });
// 將 addr 爲 '花果山' 的文檔,年齡都加 2 歲
db.students.updateMany({addr: '花果山'}, { $inc: { age: 2 } });
刪除(DELETE)
db.<collection>.remove(查詢條件, [justone]])
- 默認刪除所有符合條件的文檔
- 不傳查詢對象會報錯
- 如果傳遞一個空對象
{}
作爲參數,則會刪除集合中的所有數據。使用這種方式清空集合性能較差 justone
:<boolean>
默認是false
,設置爲true
,則只會刪除匹配到的第一個文檔
db.<collection>.deleteOne(查詢條件)
:刪除匹配到的第一個文檔db.<collection>.deleteMany(查詢條件)
:刪除匹配到的所有文檔
示例
// 刪除一條
db.students.remove({ name: '小花' }, true);
// 等同於 deleteOne
db.students.deleteOne({ name: '小花' });
// 刪除多條
db.students.remove({ age: '19' });
// 等同於
db.students.deleteMany({ age: '19' });
// 刪除所有數據(不建議使用這種方式清空數據,速度較慢)
db.students.deleteMany({});
刪除集合和數據庫
db.<collection>.drop()
: 刪除集合db.dropDatabase()
:刪除數據庫
示例
// 刪除 students 集合(建議使用這種方式清空數據,速度較快)
db.students.drop();
// 刪除當前數據庫
db.dropDatabase();