一、MongoDB簡介
1. mangodb是一種基於分布式、文件存儲的非關系型數據庫
2. C++寫的,性能高
3. 為web應用提供可擴展的高性能數據存儲解決方案
4. 所支持的格式是json格式
二、MongoDB三元素&和關系型數據庫的區別
三元素:數據庫 集合(類似關系型數據庫的表) 文檔(類似關系型數據庫中的行)
文檔:就是一個對象,由鍵值對構成{"name":"zhangsan","age":33}
集合:類似於數據庫中的表,儲存多個文檔,結構不固定
{"name":"zhangsan","age":33}
{"name":"zhangsan","age":33}
{"book":"python","price":33}
數據庫:是一個集合的物理容器,一個數據庫可以包含多個文檔
| SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
|---|---|---|
| database | database | 數據庫 |
| table | collection | 數據庫表/集合 |
| row | document | 數據記錄行/文檔 |
| column | field | 數據字段/域 |
| index | index | 索引 |
| table joins | 表連接,MongoDB不支持 | |
| primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
三、MongoDB自帶的數據庫
admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。
local: 這個數據永遠不會被復制,可以用來存儲限於本地單台服務器的任意集合
config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。
test:MongoDB的默認數據庫是test。 如果沒有創建任何數據庫,那么集合將被保存在測試數據庫。
四、MongoDB數據庫命令
mongod 開啟服務器
mongo 開啟客戶端
show dbs 顯示所有數據庫列表
db 顯示當前數據庫對象/集合
use 連接到一個指定的數據庫;如果數據庫不存在,會被創建。
db.dropDatabase() 刪除選定的數據庫
注意:show dbs要顯示數據庫,需要插入一個文檔進去。
五、集合(表)的創建
MongoDB中使用db.createCollection(name,option)用來創建集合
name 是要創建集合的名稱。
option 用於指定集合的配置,(可選)指定有關內存大小和索引選項
db.createCollection("myconllection") 創建集合
show collections 檢查創建的集合
db.COLLECTION_NAME.drop() 刪除集合 : db.myconllection.drop()
在MongoDB中可以不創建集合,當插入一些文檔的時候MongoDB會自動創建集合。
六、文檔(一行記錄)
文檔是一組鍵值對。MongoDB不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關系型數據庫有很大區別,也是MongoDB的特點。
文檔中的鍵/值對是有序的。
文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
MongoDB區分類型和大小寫。
MongoDB的文檔不能有重復的鍵。
文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
七、MongoDB中的數據類型
| 數據類型 | 描述 |
|---|---|
| String | 字符串。存儲數據常用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。 |
| Integer | 整型數值。用於存儲數值。根據你所采用的服務器,可分為 32 位或 64 位。 |
| Boolean | 布爾值。用於存儲布爾值(真/假)。 |
| Double | 雙精度浮點值。用於存儲浮點值。 |
| Min/Max keys | 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
| Array | 用於將數組或列表或多個值存儲為一個鍵。 |
| Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
| Object | 用於內嵌文檔。 |
| Null | 用於創建空值。 |
| Symbol | 符號。該數據類型基本上等同於字符串類型,但不同的是,它一般用於采用特殊符號類型的語言。 |
| Date | 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息。 |
| Object ID | 對象 ID。用於創建文檔的 ID。 |
| Binary Data | 二進制數據。用於存儲二進制數據。 |
| Code | 代碼類型。用於在文檔中存儲 JavaScript 代碼。 |
| Regular expression | 正則表達式類型。用於存儲正則表達式。 |
八、文檔的插入
MongoDB中使用insert()和save()方法向集合中插入文檔,語法如下:
db.collection_name.insert() db.mycol.insert({ _id: 1, title: 'MongoDB Overview', description: 'MongoDB is no sql database', by: 'weiheng', url: 'http://www.weiheng.site', tags: ['mongodb', 'database', 'NoSQL'], likes: 1, })
如果不指定_id參數,那么 MongoDB 會為此文檔分配一個唯一的ObjectId。
ObjectId的生成規則: _id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)
要在集合中插入多個文檔,可以在insert()命令中傳遞文檔數組:
db.mycollection.insert([ { "_id":2, "title":"MongoDB Overview", "descrption":"MongoDB is no sql database", "by":"weiheng", "url":"http://www.weiheng.site", "likes":1, }, { "_id":3, "title":"MongoDB Overview", "descrption":"MongoDB is no sql database", "by":"weiheng", "url":"http://www.weiheng.site", "likes":1, }, ])
db.collection_name.insertOne()
將單個文檔插入集合中,該方法返回包含新插入文檔的_id.
db.inventory.insertOne( { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm"} } )
返回結果
db.inventory.insertOne( ... { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } } ... ) { "acknowledged" : true, "insertedId" : ObjectId("5955220846be576f199feb55") }
db.collection_name.insertMany()
方法將多個文檔插入到集合中,可將一系列文檔傳遞給它。insertMany()返回包含新插入的文檔_id字段值的文檔。
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ])
返回結果
db.inventory.insertMany([
... { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
... { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
... { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("59552c1c46be576f199feb56"),
ObjectId("59552c1c46be576f199feb57"),
ObjectId("59552c1c46be576f199feb58")
]
}
九、MongoDB文檔的查詢
要從MongoDB集合中查詢數據,需要使用MongoDB的find()方法
find()命令基本語法:
db.collection_name.find(document)
find()會以非結構化的方式顯示所有文檔內容:
{ "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 2, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 3, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 4, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
pretty():格式化數據並顯示結果:
db.collection_name.find().pretty() { "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
除了find()還有findOne()它只會返回一個文檔;默認返回第一個:
findOne()語法:
db.collenction_name.findOne()
十、條件操作&比較運算符
操作 語法 示例 RDBMS等效語句 相等 {<key>:<value>} db.mycol.find({"by":"weiheng"}).pretty() where by = 'weiheng' 小於 {<key>:{$lt:<value>}} db.mycol.find({"likes":{$lt:50}}).pretty() where likes < 50 小於等於 {<key>:{$lte:<value>}} db.mycol.find({"likes":{$lte:50}}).pretty() where likes <= 50 大於 {<key>:{$gt:<value>}} db.mycol.find({"likes":{$gt:50}}).pretty() where likes > 50 大於等於 {<key>:{$gte:<value>}} db.mycol.find({"likes":{$gte:50}}).pretty() where likes >= 50 不等於 {<key>:{$ne:<value>}} db.mycol.find({"likes":{$ne:50}}).pretty() where likes != 50
(1) 在find()中,如果將條件以,分割,則MongoDB將其視為AND操作
db.mycol.find({$and: [{key1: value1}, {key2:value2}]})
# by為weiheng,title為MongoDB Overview的文章
db.mycollection.findOne({
$and:[
{"by":"weiheng"},
{"title":"MongoDB Overview"}
]
})
(2) MongoDB中的OR操作符。基本語法和AND相同
db.mycol.find({$or: [{key1: value1}, {key2:value2}]})
db.mycollection.findOne({
$or:[
{"by":"weiheng"},
{"title":"MongoDB Overview"}
]
})
(3) AND和OR
db.mycol.find({key:value,$or: [{key1: value1}, {key2:value2}]})
十一、update()更新操作
MongoDB中使用Update將集合中的文檔進行更新,update()方法更新現有文檔中的值,而save()方法使用save()方法中傳遞的文檔數據替換現有文檔。
update語法:
db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
示例:修改id為1的title
// 查看id:1的信息 db.mycollection.find({'id':1}) { "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 } // 修改一下title為MongoDB db.mycollection.update({'id':1},{"$set":{"title":"MongoDB"}}) // 再次查詢 db.mycollection.find({'id':1}) { "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
十二、remove() & deleteOne() & deleteMany() 刪除操作
MongoDB中的 remove()方法用於從集合中刪除文檔。(官方不推薦使用remove(),推薦deleteOne和deleteMany())
remove()方法的基本語法如下:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
示例: 刪除id為1的數據
// 以下示例將刪除_id為“100”的文檔。 db.mycollection.remove({'id':1})
官方推薦使用 deleteOne() 和 deleteMany() 方法:
db.inventory.deleteMany({title: "MongoDB" })
db.inventory.deleteOne({title: "MongoDB" })
