官方文檔:MongoDB中文手冊|官方文檔中文版 | MongoDB-CN-Manual
什么是MongoDB?
MongnDB是一個分布式文件存儲數據庫(或叫文檔數據庫),是一個介于 關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫,最接近關系型數據庫的。
MongoDB中的記錄是一個文檔,它是由字段和值(key:value)對組成的數據結構。MongoDB文檔類似于JSON的BSON類型,BSON就是JSON的二進制表示,文檔的字段的值可以包括其他文檔,數組和文檔數組。
MongoDB 特點
MongoDB 的一些關鍵特點:
- 文檔導向:MongoDB 存儲 BSON(二進制 JSON)文檔,這些文檔可以包含復雜的數據結構,如數組和嵌套對象。
- 高性能:MongoDB 提供了高性能的數據持久化和查詢能力,特別是對于寫入密集型的應用。
- 水平擴展:通過分片(sharding)技術,MongoDB 可以在多個服務器之間分布數據,實現水平擴展。
- 高可用性:MongoDB 支持副本集(replica sets),提供數據的自動故障轉移和數據冗余。
- 靈活的聚合框架:MongoDB 提供了一個強大的聚合框架,允許執行復雜的數據處理和聚合操作。
- 豐富的查詢語言:MongoDB 的查詢語言(MQL)支持豐富的查詢操作,包括文本搜索、地理位置查詢等。
- 存儲過程:MongoDB 支持在數據庫內部執行 JavaScript 代碼,允許定義和執行復雜的數據處理邏輯。
- GridFS:對于存儲大于 BSON 文檔大小限制(16MB)的文件,MongoDB 提供了 GridFS,一種用于存儲和檢索大文件的規范。
- 安全性:MongoDB 提供了多層次的安全特性,包括認證、授權和加密。
- 驅動程序和工具:MongoDB 擁有廣泛的驅動程序支持,適用于不同的編程語言,以及各種管理工具和可視化界面。
- 社區和生態系統:MongoDB 擁有一個活躍的開發者社區,提供了大量的教程、文檔和第三方工具
MongoDB三大核心概念
1. 數據庫(Database)
數據庫是集合的物理容器,每個數據庫在文件系統上有自己的文件集,一個MongoDB服務器通常有多個數據庫,類似于關系型數據庫中的數據庫。
2. 集合(Collection)
集合是一組MongoDB文檔的集合,相當于RDBMS的表。集合存在于一個單獨的數據庫中。集合不強制執行模式,集合中的文檔可以具有不同的字段,通常,集合中的所有文檔具有相似或相關的目的。類似于關系型數據庫中的表。
3. 文檔(Document)
文檔是一組鍵值對。文檔具有動態模式,動態模式意味著同一個集合中的文檔不需要具有相同的字段或結構,并且集合的文檔中的共同字段可能包含不同類型的數據。類似于關系型數據庫中的行(row),以 BSON 格式存儲。
一條文檔示例:(博客)
{_id: ObjectId(7df78ad8902c)title: 'MongoDB Overview', description: 'MongoDB is no sql database',by: 'tutorials point',url: 'http://www.tutorialspoint.com',tags: ['mongodb', 'database', 'NoSQL'],likes: 100, comments: [ {user:'user1',message: 'My first comment',dateCreated: new Date(2011,1,20,2,15),like: 0 },{user:'user2',message: 'My second comments',dateCreated: new Date(2011,1,25,7,45),like: 5}]
}
其中"_id"是自動生成的,可以自己另外設置一個“_id”的值覆蓋自動生成“_id”的值。但是如果文檔已經生成了就無法直接去修改“_id”的值,但是可以通過“刪除-添加”的方式實現
RDBMS術語與MongoDB之間的關系
關系型數據庫管理系統(RDBMS) | MongoDB |
數據庫(Database) | 數據庫(Database) |
表(Table) | 集合(Collection) |
元組/行(Tuple/Row) | 文檔(Document) |
列(Column) | 字段(Field) |
表連接(Table Join) | 嵌入式文檔(Embedded Documents) |
主鍵(Primary Key) | 主鍵(默認鍵_id由MongoDB自身提供) |
MongoDB的安裝
下載地址:Download MongoDB Community Server | MongoDB
選擇合適的版本下載:
安裝步驟鏈接:Windows(超詳細保姆級教學)安裝mongodb數據庫_windows安裝mongodb-CSDN博客
根據上面的連接成功連接上mongodb數據庫
注意:安裝過程中是否設置了密碼,我沒有設置所以驗證就是none;
MongoDB的常用操作命令
數據庫操作
a. 創建數據庫
use 數據庫名
使用 use 命令來指定一個數據庫時,如果該數據庫不存在,MongoDB將自動創建它。
b. 查看數據庫列表
show dbs
c. 刪除數據庫
use 數據庫名 //先切換到要刪除的數據庫
db.dropDatabase() //然后刪除當前數據庫
集合操作
操作某個數據庫的集合要記住使用【use 數據庫名】,切換數據庫
a. 創建集合
db.createCollection(name, options)
參數說明:
- name: 要創建的集合名稱。
- options: 可選參數, 指定有關內存大小及索引的選項。
options 可以是如下參數:
參數名 | 類型 | 描述 | 示例值 |
| 布爾值 | 是否創建一個固定大小的集合。 |
|
| 數值 | 集合的最大大小(以字節為單位)。僅在 為 true 時有效。 |
(10MB) |
| 數值 | 集合中允許的最大文檔數。僅在 為 true 時有效。 |
|
| 對象 | 用于文檔驗證的表達式。 |
|
| 字符串 | 指定文檔驗證的嚴格程度。 :不進行驗證。 :插入和更新操作都必須通過驗證(默認)。 :僅現有文檔更新時必須通過驗證,插入新文檔時不需要。 |
|
| 字符串 | 指定文檔驗證失敗時的操作。 :阻止插入或更新(默認)。 :允許插入或更新,但會發出警告。 |
|
| 對象 | 為集合指定存儲引擎配置。 |
|
| 對象 | 指定集合的默認排序規則。 |
|
b. 更新集合
db.adminCommand({
renameCollection: "原數據庫.原集合",
to: "目標數據庫.目標集合",
dropTarget: <boolean>
})
參數說明:
- renameCollection:要重命名的集合的完全限定名稱(包括數據庫名)。
- to:目標集合的完全限定名稱(包括數據庫名)。
- dropTarget(可選):布爾值。如果目標集合已經存在,是否刪除目標集合。默認值為
false
。
c. 刪除集合
db.集合名.drop()
drop() 方法可以永久地從數據庫中刪除指定的集合及其所有文檔,這是一個不可逆的操作,因此需要謹慎使用
文檔操作
a. 添加文檔
方法 | 用途 | 是否棄用 |
| 插入單個文檔 | 否 |
| 插入多個文檔 | 否 |
| 插入單個或多個文檔 | 是 |
| 插入或更新文檔 | 是 |
db.集合.insertOne(document, options)
- document:要插入的單個文檔。
- options(可選):一個可選參數對象,可以包含 writeConcern 和 bypassDocumentValidation 等。
實例:
db.myCollection.insertOne(
{
name: "Alice",
age: 25,
city: "New York"
}
);
db.集合.insertMany(documents, options)
- documents:要插入的文檔數組。
- options(可選):一個可選參數對象,可以包含 ordered、writeConcern 和 bypassDocumentValidation 等。
db.myCollection.insertMany(
[
{ name: "Bob", age: 30, city: "Los Angeles" },
{ name: "Charlie", age: 35, city: "Chicago" }
]
);
從 MongoDB 4.2 開始,db.collection.save() 和 insert()已被標記為棄用
b. 更新文檔
ⅰ. 更新單個文檔
db.集合.updateOne(filter, update, options)
- filter:用于查找文檔的查詢條件。
- update:指定更新操作的文檔或更新操作符。
- options:可選參數對象,如
upsert
、arrayFilters
等。
示例:
db.myCollection.updateOne(
{ name: "Alice" }, // 過濾條件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // 可選參數
);
ⅱ. 批量更新
db.集合.updateMany(filter, update, options)
ⅲ. 單個文檔替換
db.集合.replaceOne(filter, replacement, options)
- filter:用于查找文檔的查詢條件。
- replacement:新的文檔,將替換舊的文檔。
- options:可選參數對象,如
upsert
等。
示例:
db.myCollection.replaceOne(
{ name: "Bob" }, // 過濾條件
{ name: "Bob", age: 31 } // 新文檔
);
ⅳ. 查找并更新
db.集合.findOneAndUpdate(filter, update, options)
- filter:用于查找文檔的查詢條件。
- update:指定更新操作的文檔或更新操作符。
- options:可選參數對象,如
projection
、sort
、upsert
、returnDocument
等
options 參數通常可以包含以下選項:
- upsert:如果沒有匹配的文檔,是否插入一個新文檔。
- arrayFilters:當更新嵌套數組時,指定應更新的數組元素的條件。
- collation:指定比較字符串時使用的排序規則。
- returnDocument:在 findOneAndUpdate 中使用,指定返回更新前 ("before") 或更新后 ("after") 的文檔。
c. 刪除文檔
ⅰ. 刪除單個文檔
db.集合.deleteOne(filter, options)
- filter:用于查找要刪除的文檔的查詢條件。
- options(可選):一個可選參數對象。
ⅱ. 批量刪除
db.集合.deleteMany(filter, options)
ⅲ. 查找并刪除單個文檔
db.集合.findOneAndDelete(filter, options)
- filter:用于查找要刪除的文檔的查詢條件。
- options:可選參數對象,如
projection
、sort
等
示例:
db.myCollection.findOneAndDelete(
{ name: "Charlie" },
{ projection: { name: 1, age: 1 } }
);
刪除操作options 參數通常可以包含以下選項:
- writeConcern:指定寫操作的確認級別。
- collation:指定比較字符串時使用的排序規則。
- projection(僅適用于
findOneAndDelete
):指定返回的字段。 - sort(僅適用于
findOneAndDelete
):指定排序順序以確定要刪除的文檔。
d. 查詢文檔
ⅰ. 簡單查詢
db.集合.find(query, projection)
- query:用于查找文檔的查詢條件。默認為
{}
,即匹配所有文檔。 - projection(可選):指定返回結果中包含或排除的字段。
示例
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法,語法格式如下:
db.集合.find().pretty()
pretty() 方法以格式化的方式來顯示所有文檔。
示例
db.col.find().pretty()
結果:
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個 Nosql 數據庫",
"by" : "菜鳥教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
db.集合.findOne(query, projection)
ⅱ. 高級查詢方法
1. 使用比較操作符
MongoDB 支持多種比較操作符,如 $gt、$lt、$gte、$lte、$eq、$ne 等。
操作符 | 描述 | 示例 |
| 等于 |
|
| 不等于 |
|
| 大于 |
|
| 大于等于 |
|
| 小于 |
|
| 小于等于 |
|
| 在指定的數組中 |
|
| 不在指定的數組中 |
|
示例:
查找年齡大于 25 的文檔:
db.myCollection.find({ age: { $gt: 25 } });
2. 使用邏輯操作符
MongoDB 支持多種邏輯操作符,如 $and、$or、$not、$nor 等。
操作符 | 描述 | 示例 |
| 邏輯與,符合所有條件 |
|
| 邏輯或,符合任意條件 |
|
| 取反,不符合條件 |
|
| 邏輯或非,均不符合條件 |
|
示例:
找年齡大于 25 且城市為 "New York" 的文檔:
db.myCollection.find({
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
});
'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
結果:
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個 Nosql 數據庫",
"by" : "菜鳥教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
3. 使用元素操作符
操作符 | 描述 | 示例 |
| 字段是否存在 |
|
| 字段的 BSON 類型 |
|
示例:
查找包含 age 字段的文檔:
db.collection.find({ age: { $exists: true } })
查找 age 字段為整數類型的文檔:
db.collection.find({ age: { $type: "int" } })
4. 使用數組操作符
操作符 | 描述 | 示例 |
| 數組包含所有指定的元素 |
|
| 數組中的元素匹配指定條件 |
|
| 數組的長度等于指定值 |
|
5. 使用其他操作符
操作符 | 描述 | 示例 |
| 匹配正則表達式 |
|
| 進行文本搜索 |
|
| 使用 JavaScript 表達式進行條件過濾 |
|
$near | 查找接近指定點的文檔 |
|
$geoWithin | 查找在指定地理區域內的文檔 |
|
6. 使用正則表達式
可以使用正則表達式進行模式匹配查詢。
示例:
查找名字以 "A" 開頭的文檔:
db.myCollection.find({ name: /^A/ });
7. 投影(指定返回結果字段)
投影用于控制查詢結果中返回的字段。可以使用包含字段和排除字段兩種方式。
示例:
只返回名字和年齡字段:
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
8. 排序
示例:
按年齡降序排序:
db.myCollection.find().sort({ age: -1 });
9. 限制與跳過(分頁)
可以對查詢結果進行限制和跳過指定數量的文檔。
示例1:
返回前 10 個文檔:
db.myCollection.find().limit(10);
示例2:
跳過前 5 個文檔,返回接下來的 10 個文檔:
db.myCollection.find().skip(5).limit(10);
e. 聚合統計
MongoDB 中聚合(aggregate)主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。
ⅰ. aggregate() 方法
db.集合.aggregate(AGGREGATE_OPERATION)
表達式 | 描述 | 實例 |
$sum | 計算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 計算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 獲取集合中所有文檔對應值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 獲取集合中所有文檔對應值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 將值加入一個數組中,不會判斷是否有重復的值。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 將值加入一個數組中,會判斷是否有重復的值,若相同的值在數組中已經存在了,則不加入。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根據資源文檔的排序獲取第一個文檔數據。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根據資源文檔的排序獲取最后一個文檔數據 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
ⅱ. 管道操作
管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。管道操作是可以重復的。
表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
聚合框架中常用的幾個操作:
- $project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。
- $match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
- $limit:用來限制MongoDB聚合管道返回的文檔數。
- $skip:在聚合管道中跳過指定數量的文檔,并返回余下的文檔。
- $unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
- $group:將集合中的文檔分組,可用于統計結果。
- $sort:將輸入文檔排序后輸出。
- $geoNear:輸出接近某一地理位置的有序文檔。
示例:
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } }, //第一個管道
{ $group: { _id: null, count: { $sum: 1 } } } //第二個管道
] );
$match用于獲取分數大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進行處理。
按順序將前一個管道的處理后的數據傳給后一個管道的處理,以此類推
關注我,下一篇講Spring Boot 整合MongoDB