Mongodb 數據庫

後續技術類文檔更新到微信公衆號-------->>喜歡的掃碼關注

在這裏插入圖片描述

mongodb

首先關係型數據庫和非關係型數據庫的介紹;
對於關係型的數據庫,存儲數據之前,必須先建表建庫,隨着數據的複雜度越來越高,所建表的數量也就越來越多
但是非關係型數據庫卻不需要如此複雜;

關係型數據庫很強大,但是它並不能很好的應付所有的應用場景;
MySQL的擴展性差;大數據下IO壓力大;表結構更改困難。

mongodb 易擴展,大數據量高性能,靈活的數據模型,高可用。

mongodb有那些優勢;
  1. 易擴展性;nosql數據庫的種類繁多;共同的特點就是去掉了關係型數據庫的關係型特性;數據之間沒有關係
    這樣就非常容易擴展。
  2. 大數據。高性能;nosql都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀,得益於它的無關係
    性,數據庫結構簡單;
  3. 靈活的數據模型,不需要爲事先存儲的數據建立字段,隨時可以存儲自定義格式的數據,在關係型數據庫中
    增刪是一件很麻煩的事,如果是一個非常大的數據量的表,增加字段簡直就是噩夢。
mongodb的數據庫命令:

查看當前數據庫: db
查看所有的數據庫: show dbs 或者 show databases
切換數據庫: use db_name
刪除當前數據庫:db.dropDatabase()

mongodb的集合命令:

1, 如果不手動創建集合;向不存在的集合中第一次加入數據的時候,集合會被自動創建出來。

手動創建集合的命令:
db.createCollection(name,options)
db.createCollection(“stu”)
db.createCollection(“sub”, { capped : true, size : 10 } )
參數capped: 默認值爲false表示不設置上限,值爲true表示設置上限
參數size: 當capped值爲true時, 需要指定此參數, 表示上限⼤⼩,當⽂檔達到上限時, 會將之前的數據覆蓋, 單位爲字節
查看集合:show collections
刪除集合:db.集合名稱.drop()

mongodb常見的數據類型:
Object ID: ⽂檔ID
String: 字符串, 最常⽤, 必須是有效的UTF-8
Boolean: 存儲⼀個布爾值, true或false
Integer: 整數可以是32位或64位, 這取決於服務器
Double: 存儲浮點值
Arrays: 數組或列表, 多個值存儲到⼀個鍵
Object: ⽤於嵌⼊式的⽂檔, 即⼀個值爲⼀個⽂檔
Null: 存儲Null值
Timestamp: 時間戳, 表示從1970-1-1到現在的總秒數
Date: 存儲當前⽇期或時間的UNIX時間格式

字符串;
布爾值;
整數;
浮點數;
數組,列表;
文檔;
Null;
時間戳;
日期;
九種數據類型 。

mongodb的數據插入:
db.集合名稱.insert(document)
db.stu.insert({name:‘gj’,gender:1})
db.stu.insert({_id:“20170101”,name:‘gj’,gender:1})

插入文檔時候如果不指定id,會自動分配;

4.2 mongodb的保存
命令:db.集合名稱.save(document) 如果⽂檔的_id已經存在則修改, 如果⽂檔的_id不存在則添加

4.3 mongodb的簡單查詢
命令:db.集合名稱.find()

4.4 mongodb的更新
命令:db.集合名稱.update( ,,{multi: })

參數query:查詢條件
參數update:更新操作符
參數multi:可選, 默認是false,表示只更新找到的第⼀條記錄, 值爲true表示把滿⾜條件的⽂檔全部更新
db.stu.update({name:‘hr’},{name:‘mnc’}) 更新一條
db.stu.update({name:‘hr’},{KaTeX parse error: Expected 'EOF', got '}' at position 17: …et:{name:'hys'}}̲) 更新一條 db.st…set:{gender:0}},{multi:true}) 更新全部
注意:“multi update only works with $ operators”

4.5 mongodb的刪除
命令:db.集合名稱.remove(,{justOne: })

參數query:可選,刪除的⽂檔的條件
參數justOne:可選, 如果設爲true或1, 則只刪除⼀條, 默認false, 表示刪除多條
5. mongodb的高級查詢
知識點:

掌握mongodb的數據查詢操作
掌握比較運算符的使用
掌握邏輯運算符的使用
掌握範圍運算符的使用
瞭解正則的使用
掌握skip和limit的使用
掌握投影方法的使用
掌握排序方法的使用
瞭解去重方法的使用

5.1 數據查詢
⽅法find(): 查詢

db.集合名稱.find({條件⽂檔})

⽅法findOne():查詢,只返回第⼀個

db.集合名稱.findOne({條件⽂檔})

⽅法pretty(): 將結果格式化

db.集合名稱.find({條件⽂檔}).pretty()

5.2 比較運算符
可以使用以下數據進行練習

{“name” : “郭靖”, “hometown” : “蒙古”, “age” : 20, “gender” : true }
{“name” : “⻩蓉”, “hometown” : “桃花島”, “age” : 18, “gender” : false }
{“name” : “華箏”, “hometown” : “蒙古”, “age” : 18, “gender” : false }
{“name” : “⻩藥師”, “hometown” : “桃花島”, “age” : 40, “gender” : true }
{“name” : “段譽”, “hometown” : “⼤理”, “age” : 16, “gender” : true }
{“name” : “段王爺”, “hometown” : “⼤理”, “age” : 45, “gender” : true }
{“name” : “洪七公”, “hometown” : “華⼭”, “age” : 18, “gender” : true }
等於: 默認是等於判斷, 沒有運算符
⼩於:ltlessthanlt (less than) ⼩於等於:lte (less than equal)
⼤於:gtgreaterthangt (greater than) ⼤於等於:gte
不等於:$ne

例如:

查詢年齡大於18的所有學生
db.stu.find({age:{$gte:18}})
5.3 邏輯運算符
邏輯運算符主要指與、或邏輯

and:在json中寫多個條件即可

查詢年齡⼤於或等於18, 並且性別爲true的學⽣
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 7: gte:18}̲,gender:true}) …or, 值爲數組, 數組中每個元素爲json

查詢年齡⼤於18, 或性別爲false的學⽣
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gt:18}},{gender:false}]})

查詢年齡⼤於18或性別爲男⽣, 並且姓名是郭靖
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gte:18}},{gender:true}],name:‘gj’})
5.4 範圍運算符
使⽤$in, $nin 判斷數據是否在某個數組內

查詢年齡爲18、 28的學⽣
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 14: in:[18,28,38]}̲}) 5.5 ⽀持正則表達式 …regex編寫正則表達式

查詢sku以abc開頭的數據
db.products.find({sku:/^abc/})

查詢sku以789結尾的數據
db.products.find({sku:{regex:789regex:'789’}})
{ “_id” : 100, “sku” : “abc123”, “description” : “Single line description.” }
{ “_id” : 101, “sku” : “abc789”, “description” : “First line\nSecond line” }
{ “_id” : 102, “sku” : “xyz456”, “description” : “Many spaces before line” }
{ “_id” : 103, “sku” : “xyz789”, “description” : “Multiple\nline description” }
5.6 skip和limit
⽅法limit(): ⽤於讀取指定數量的⽂檔

db.集合名稱.find().limit(NUMBER)
查詢2條學⽣信息
db.stu.find().limit(2)
⽅法skip(): ⽤於跳過指定數量的⽂檔

db.集合名稱.find().skip(NUMBER)
db.stu.find().skip(2)
同時使用

db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)
注意:先使用skip在使用limit的效率要高於前者

5.7 自定義查詢*
由於mongo的shell是一個js的執行環境 使⽤$where後⾯寫⼀個函數, 返回滿⾜條件的數據

查詢年齡⼤於30的學⽣
db.stu.find({
$where:function() {
return this.age>30;}
})
5.8 投影
在查詢到的返回結果中, 只選擇必要的字段

命令:db.集合名稱.find({},{字段名稱:1,…})

參數爲字段與值, 值爲1表示顯示, 值爲0不顯 特別注意: 對於_id列默認是顯示的, 如果不顯示需要明確設置爲0

db.stu.find({},{_id:0,name:1,gender:1})

5.9 排序
⽅法sort(), ⽤於對 集進⾏排序

命令:db.集合名稱.find().sort({字段:1,…})

參數1爲升序排列 參數-1爲降序排列

根據性別降序, 再根據年齡升序
db.stu.find().sort({gender:-1,age:1})
5.10 統計個數
⽅法count()⽤於統計結果集中⽂檔條數

命令:db.集合名稱.find({條件}).count() 命令:db.集合名稱.count({條件})

db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20},gender:true})
5.11 消除重複
⽅法distinct()對數據進⾏去重

命令:db.集合名稱.distinct(‘去重字段’,{條件})

db.stu.distinct(‘hometown’,{age:{$gt:18}})

  1. mongodb的常用管道和表達式
    知識點:

掌握mongodb中管道的語法
掌握mongodb中管道命令
2.1 常用管道命令
在mongodb中,⽂檔處理完畢後, 通過管道進⾏下⼀次處理 常用管道命令如下:

$group: 將集合中的⽂檔分組, 可⽤於統計結果
$match: 過濾數據, 只輸出符合條件的⽂檔
$project: 修改輸⼊⽂檔的結構, 如重命名、 增加、 刪除字段、 創建計算結果
$sort: 將輸⼊⽂檔排序後輸出
$limit: 限制聚合管道返回的⽂檔數
skip2.2:skip: 跳過指定數量的⽂檔, 並返回餘下的⽂檔 2.2 常用表達式 表達式:處理輸⼊⽂檔並輸出 語法:表達式:'列名’ 常⽤表達式:

$sum: 計算總和, $sum:1 表示以⼀倍計數
$avg: 計算平均值
$min: 獲取最⼩值
$max: 獲取最⼤值
$push: 在結果⽂檔中插⼊值到⼀個數組中

mongodb創建索引;

加快查詢速度;
進行數據的去重;

mongodb創建簡單的索引方法
語法:

db.集合.ensureIndex({屬性:1}),1表示升序, -1表示降序
db.集合.createIndex({屬性:1})
上面兩個命令效果等價
具體操作:db.db_name.ensureIndex({name:1})

添加唯一索引的語法:

db.collection_name.ensureIndex({“name”:1},{“unique”:true})

刪除索引
語法:db.t1.dropIndex({‘索引名稱’:1})

建立複合索引

在進行數據去重的時候,可能用一個字段來保證數據的唯一性,這個時候可以考慮建立複合索引來實現。

例如:抓全貼吧信息,如果把帖子的名字作爲唯一索引對數據進行去重是不可取的,因爲可能有很多帖子名字相同

建立複合索引的語法:db.collection_name.ensureIndex({字段1:1,字段2:1})

python與 mongodb交互:

from pymongo import MongoClient
client = MongoClient(host,port)
collection = client[db名][集合名]
添加一條數據

ret = collection.insert_one({“name”:“test10010”,“age”:33})
print(ret)
添加多條數據

item_list = [{“name”:“test1000{}”.format(i)} for i in range(10)]
insert_many接收一個列表,列表中爲所有需要插入的字典
t = collection.insert_many(item_list)

查找一條數據

find_one查找並且返回一個結果,接收一個字典形式的條件
t = collection.find_one({“name”:“test10005”})
print(t)
查找全部數據

結果是一個Cursor遊標對象,是一個可迭代對象,可以類似讀文件的指針,但是隻能夠進行一次讀取

find返回所有滿足條件的結果,如果條件爲空,則返回數據庫的所有
t = collection.find({“name”:“test10005”})
#結果是一個Cursor遊標對象,是一個可迭代對象,可以類似讀文件的指針,
for i in t:
print(i)
for i in t: #此時t中沒有內容
print(i)
更新一條數據 注意使用$set命令

update_one更新一條數據
collection.update_one({“name”:“test10005”},{"$set":{“name”:“new_test10005”}})
更行全部數據

update_one更新全部數據
collection.update_many({“name”:“test10005”},{"$set":{“name”:“new_test10005”}})
刪除一條數據

delete_one刪除一條數據
collection.delete_one({“name”:“test10010”})
刪除全部數據

delete_may刪除所有滿足條件的數據
collection.delete_many({“name”:“test10010”})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章