一、MongoDB簡介
-
概述
MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫阿弃。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。MongoDB介于關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù)庫之間缀雳,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富渡嚣,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散肥印,類似json格式识椰,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。
MongoDB最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大深碱,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言腹鹉,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫表單查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引敷硅。
-
MySQL
關(guān)系型數(shù)據(jù)庫功咒。 查詢語句是使用傳統(tǒng)的sql語句愉阎,擁有較為成熟的體系,成熟度很高力奋。 關(guān)系型數(shù)據(jù)庫遵循ACID規(guī)則 開源數(shù)據(jù)庫的份額在不斷增加榜旦,mysql的份額頁在持續(xù)增長。 缺點(diǎn):在海量數(shù)據(jù)處理的時(shí)候效率會(huì)顯著變慢景殷。數(shù)據(jù)庫事務(wù)必須具備ACID特性溅呢,ACID是Atomic原子性,Consistency一致性猿挚,Isolation隔離性咐旧,Durability持久性。
數(shù)據(jù)的持久存儲绩蜻,尤其是海量數(shù)據(jù)的持久存儲铣墨,還是需要一種關(guān)系數(shù)據(jù)庫。 -
MongoDB
非關(guān)系型數(shù)據(jù)庫(nosql ),屬于文檔型數(shù)據(jù)庫辜羊。存儲方式:虛擬內(nèi)存+持久化踏兜。
查詢語句:是獨(dú)特的MongoDB的查詢方式。
適合場景:事件的記錄八秃,內(nèi)容管理或者博客平臺等等碱妆。
數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的,只不過需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中昔驱,將數(shù)據(jù)存儲在物理內(nèi)存中疹尾,從而達(dá)到高速讀寫。
成熟度與廣泛度:新興數(shù)據(jù)庫骤肛,成熟度較低纳本,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一腋颠,適用人群不斷在增長繁成。
優(yōu)勢: 快速!在適量級的內(nèi)存的MongoDB的性能是非常迅速的淑玫,它將熱數(shù)據(jù)存儲在物理內(nèi)存中巾腕,使得熱數(shù)據(jù)的讀寫變得十分快, 高擴(kuò)展絮蒿, json的存儲格式尊搬!文檔的數(shù)據(jù)庫: 即可以存放xml、json土涝、bson類型系那個(gè)的數(shù)據(jù)佛寿。這些數(shù)據(jù)具備自述性(self-describing),呈現(xiàn)分層的樹狀數(shù)據(jù)結(jié)構(gòu)但壮。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成冀泻。
-
關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別
關(guān)系型數(shù)據(jù)庫通過外鍵關(guān)聯(lián)來建立表與表之間的關(guān)系常侣;
非關(guān)系型數(shù)據(jù)庫通常指數(shù)據(jù)以對象的形式存儲在數(shù)據(jù)庫中,而對象之間的關(guān)系通過每個(gè)對象自身的屬性來決定腔长;學(xué)生: 張三 性別: 男 科目: 語文 成績: 80 關(guān)系型數(shù)據(jù)庫: // 學(xué)生表 create table student(id int primary key, name char(50), sex char(10)) // 成績表袭祟,stuid存儲的是學(xué)生表中對應(yīng)的主鍵,用于表的關(guān)聯(lián) create table score(id int primary key, name char(20),grade int,stuid int, foreign key(stuid) references student(id)) 非關(guān)系型數(shù)據(jù)庫: { "name":"張三", "sex":"男", "score":{ "name":"語文", "grade": 80 } }
關(guān)系型數(shù)據(jù)庫SQLite捞附、Oracle巾乳、mysql
非關(guān)系型數(shù)據(jù)庫 MongoDb、redis MySQL和MongoDB的區(qū)別
數(shù)據(jù)庫: 容器鸟召,不管是mysql還是mongodb胆绊,一個(gè)單一的服務(wù)器都可以管理多個(gè)數(shù)據(jù)庫;
集合:是一組mongodb的文件,等價(jià)于mysql中的table欧募,集合中文檔可以有不同的字段压状,也可以有不同的數(shù)據(jù)類型;
二、MongoDB安裝和卸載
-
卸載
sudo apt-get autoremove mongodb sudo apt-get autoclean mongodb // 清除殘留數(shù)據(jù) dpkg -l |grep ^rc|awk '{print $2}' |tr ["\n"] [" "]|sudo xargs dpkg -P
-
安裝
第1步 – 導(dǎo)入公鑰** Ubuntu軟件包管理器apt(高級軟件包工具)需要軟件分銷商的GPG密鑰來確保軟件包的一致性和真實(shí)性跟继。 執(zhí)行此下面的命令將MongoDB密鑰導(dǎo)入到您的服務(wù)器: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 第2步 – 創(chuàng)建源列表文件MongoDB 檢查URL http://repo.mongodb.org/apt/ubuntu/dists/种冬。 如果您在該網(wǎng)頁上看到一個(gè)目錄“bionic”,則將下述命令中的單詞“xenial”替換為“bionic”一詞舔糖, 【原因:MongoDB尚未發(fā)布Bionic Beaver軟件包娱两,但Xenial軟件包在Ubuntu 18.04 LTS上運(yùn)行良好】 執(zhí)行以下命令在/etc/apt/sources.list.d/中創(chuàng)建一個(gè)MongoDB列表文件: echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list 第3步 – 更新存儲庫 使用apt命令更新存儲庫: sudo apt-get update 說明:執(zhí)行完會(huì)提示一些失敗,不用在意 第4步 – 安裝MongoDB 執(zhí)行以下命令來安裝MongoDB: sudo apt-get install -y mongodb 第5步:啟動(dòng)MongoDB 執(zhí)行以下命令啟動(dòng)MongoDB并將其添加為在啟動(dòng)時(shí)啟動(dòng)的服務(wù) sudo systemctl start mongodb 如果執(zhí)行完這一步終端沒有任何輸出金吗,則說明是正確的 如果啟動(dòng)的時(shí)候提示:Failed to start mongod.service: Unit mongodb.service not found. 解決辦法如下: 1創(chuàng)建配置文件: cd /etc/systemd/system/ sudo vi mongodb.service 2.在里面追加文本: [Unit] Description=High-performance, schema-free document-oriented database After=network.target [Service] User=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf [Install] WantedBy=multi-user.target 3.退出 :wq 4.啟動(dòng)服務(wù) sudo systemctl start mongodb sudo systemctl status mongodb 5.設(shè)置開機(jī)自啟動(dòng) sudo systemctl enable mongodb 第6步:登錄MongoDB mongo 如果出現(xiàn)錯(cuò)誤全局初始化失斒ぁ:BadValue無效或無用戶區(qū)域設(shè)置。 請確保LANG和/或LC_ *環(huán)境變量設(shè)置正確摇庙,請嘗試命令: export LC_ALL=C
三旱物、MongoDB之?dāng)?shù)據(jù)庫操作
-
創(chuàng)建數(shù)據(jù)庫
# mongodb use DATABASE_NAME 注意:如果指定的數(shù)據(jù)庫DATABASE_NAME不存在,則該命令將創(chuàng)建一個(gè)新的數(shù)據(jù)庫卫袒,否則返回現(xiàn)有的數(shù)據(jù)庫 # mysql中 創(chuàng)建數(shù)據(jù)庫:create database basename; 切換數(shù)據(jù)庫:use basename;
admin:從權(quán)限的角度來說宵呛,是root的數(shù)據(jù)庫
? local:本地?cái)?shù)據(jù)
? config:配置,用于保存MongoDB的配置信息 -
檢查當(dāng)前選擇的數(shù)據(jù)
db
默認(rèn)的數(shù)據(jù)庫test
-
顯示數(shù)據(jù)庫列表
show dbs
-
刪除數(shù)據(jù)庫
// 默認(rèn)進(jìn)入數(shù)據(jù)庫是test db.dropDatabase()
注意:默認(rèn)刪除當(dāng)前正在工作的數(shù)據(jù)庫
四夕凝、MongoDB之集合操作
類似于MySQL中的表烤蜕。
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu)迹冤,意味著可以對集合插入不同格式和不同類型的數(shù)據(jù),但是盡量插入集合的時(shí)候保證數(shù)據(jù)的關(guān)聯(lián)性虎忌。
-
創(chuàng)建集合
集合名的規(guī)范: a.不能空字符串 b.集合名不能含有\(zhòng)0【空字符】泡徙,表示集合名的結(jié)尾 c.集合名不能以"system."開頭,為系統(tǒng)集合保留的關(guān)鍵字 d.不能含有保留字符膜蠢,千萬不能含有$ 語法: // name的類型為String堪藐,是要?jiǎng)?chuàng)建的集合的名稱 // options的類型是Document莉兰,是一個(gè)文檔,指定相應(yīng)的大小和索引礁竞,是可選參數(shù) // 在插入文檔時(shí)糖荒,MongoDB首先檢查上限集合capped字段的大小,然后檢查max字段 db.createCollection(name, options) 例如: // 沒有options選項(xiàng)的集合創(chuàng)建 db.createCollection("myCollection") // 有options選項(xiàng)的集合的創(chuàng)建 db.createCollection("mycol",{capped:true,autoIndexId:true,size:1024,max:10000})
-
顯示當(dāng)前數(shù)據(jù)庫中的集合
show collections
-
刪除集合
語法: // 如果選定的集合成功刪除模捂,drop()方法將返回true捶朵,否則返回false db.COLLECTION_NAME.drop() 例如: db.mycollection.drop()
五、MongoDB之文檔操作
-
文檔概念
文檔:相當(dāng)表中的一條記錄【實(shí)體】
是一組鍵值對狂男,文檔不需要設(shè)置相同的字段综看,并且相同的字段不需要相同的數(shù)據(jù)類型注意: a.文檔中的鍵值對是有序的 b.文檔中值除了字符串之外,還可以是其他數(shù)據(jù)類型【嵌套一個(gè)文檔】 c.嚴(yán)格區(qū)分大小寫和數(shù)據(jù)類型的岖食,mycol myCol d.文檔中不能有重復(fù)的鍵 e.文檔中的鍵基本都是用字符串表示的
文檔中鍵的命名: a.鍵不能包含\0 b.$和.有特殊含義 c.以下劃線開頭的鍵是保留的红碑,盡量不要使用下劃線開頭
-
插入文檔
語法: // 在插入的文檔中,如果不指定_id參數(shù)泡垃,那么 MongoDB 會(huì)為此文檔分配一個(gè)唯一的ObjectId // _id為集合中的每個(gè)文檔唯一的12個(gè)字節(jié)的十六進(jìn)制數(shù)析珊。 db.COLLECTION_NAME.insert(document) 例如: // 插入一個(gè) db.mycol.insert({id:101, name:'lisi', age:20}) db.mycol.insert({ item: "canvas", num: 100, tags: ["cotton"], size: { h: 20, w: 30, } }) // 插入多個(gè)(注意方括號) db.mycol.insert( [{id:102, name:'wagnwu', age:18}, {id:103, name:'zhaoliu', age:21}, {id:104, name:'tianqi', age:19}] ) // 查看已插入的文檔 db.mycol.find() { "_id" : ObjectId("5b8b59cb5bd1df1fc73dcdc6"), "id" : 101, "name" : "lisi", "age" : 20 } // 查看已插入的文檔 db.mycol.find().pretty() { "_id" : ObjectId("5b8b59cb5bd1df1fc73dcdc6"), "id" : 101, "name" : "lisi", "age" : 20 }
-
查詢文檔
語法: // 基本操作 db.COLLECTION_NAME.find(document) // 以格式化的方式返回查詢結(jié)果 db.COLLECTION_NAME.find(document).pretty() 注意: find() 將以非結(jié)構(gòu)化的方式返回查詢結(jié)果 例如: // 顯示所有文檔 db.mycol.find() // 默認(rèn)將所有文檔顯示,為了限制列表蔑穴,需要顯示的字段設(shè)置為1忠寻,不顯示的設(shè)置為0 db.mycol.find( {'name':'liming'}, {'name':1, 'age': 1} ) db.mycol.find( {'name':'liming'}, {'age':0} ) // 限制字段顯示 db.check.find({},{'_id':1,'title':1})
-
查詢文檔(條件查詢)
- 等于{ <key>:<value> } db.mycol.find({'name':'zyz'} ).pretty() - 小于 { <key>: {$lt:<value>} } db.mycol.find( {'age': {$lt:18}} ).pretty() - 小于等于 { <key>: {$lte:<value>} } db.mycol.find( {'age': {$lte:18}} ).pretty() - 大于 { <key>: {$gt:<value>} } db.mycol.find( {'age': {$gt:18}} ).pretty() - 大于等于 { <key>: {$gte:<value>} } db.mycol.find( {'age': {$gte:18}} ).pretty() - 不等于 { <key>: {$ne:<value>} } db.mycol.find( {'age': {$ne:18}} ).pretty() - 并列關(guān)系(and) 在find()方法中,如果通過使用 ',' 將它們分開傳遞多個(gè)鍵澎剥,則 MongoDB 將其視為AND條件 db.mycol.find( { $and: [ {key1: value1}, {key2: value2} ] } ) - 或者關(guān)系(or) db.mycol.find( { $or: [ {key1: value1}, {key2: value2} ] } )
-
更新文檔
update()更新現(xiàn)有文檔中的值,語法: db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA) 例如: // update默認(rèn)只更新一個(gè)文檔锡溯,如果要更新多個(gè)文檔,則添加參數(shù){multi:true}) db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}} ) db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}, $set: {'say': 'hello'}} ) db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}}, {multi: true} ) save()用傳遞的文檔數(shù)據(jù)替換現(xiàn)有文檔哑姚,語法: db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}) 例如: db.check.save( {'_id':102, 'title':'hello', 'by':'lalala'} )
-
刪除文檔
語法: db.COLLECTION_NAME.remove(DELLETION_CRITTERIA) 例如: db.check.remove( {'_id':100} )
六祭饭、MongoDB之查詢
-
投影
查詢過程中,只顯示指定的字段語法: db.COLLECTION_NAME.find({},{KEY:1}) 例如: db.mycol.find( {}, {'title':1, _id:0} )
在執(zhí)行find()方法時(shí)叙量,始終都會(huì)顯示_id字段倡蝙,如果不想要此字段,則需要將其設(shè)置為0
-
限制篩選記錄
limit()限制MongoDB要返回的記錄數(shù),根據(jù)指定的參數(shù)返回記錄數(shù) 語法: db.COLLECTION_NAME.find().limit(NUMBER) 例如: // 在查詢文檔時(shí)僅顯示兩個(gè)文檔 db.mycol.find({},{"title":1,_id:0}).limit(2) skip() 方法跳過指定數(shù)量的數(shù)據(jù) 語法: // 注意:skip()方法中的默認(rèn)值為0绞佩。 db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER) 例如: db.mycol.find({},{"title":1,_id:0}).limit(1).skip(2)
-
對查詢記錄排序
語法: // 使用指定順序進(jìn)行排序寺鸥,1表示升序,-1表示降序 db.COLLECTION_NAME.find().sort({KEY:1}) 例如: db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
-
管道的概念
MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理品山。管道操作是可以重復(fù)的胆建。$project:修改輸入文檔的結(jié)構(gòu)≈饨唬可以用來重命名笆载、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔 db.article.aggregate( [ {$project:{by_user:1, title:1}} ] ) $limit:用來限制MongoDB聚合管道返回的文檔數(shù) db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$limit: 2} ] ) $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔 db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$skip: 1} ] ) db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$limit:2},{$skip: 1} ] ) $group:將集合中的文檔分組凉驻,可用于統(tǒng)計(jì)結(jié)果 db.article.aggregate( [ {$group: {_id:'$by_user', num:{$sum:'$likes'}}} ] ) $sort:將輸入文檔排序后輸出 db.article.aggregate( [ {$group: {_id:'$by_user', num:{$sum:'$likes'}}},{$sort: {'num':-1}} ] )
-
分組與聚合函數(shù)查詢
aggregate()語法: db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) - $sum 從集合中的所有文檔中求出定義的值 // 計(jì)算每個(gè)作者所寫的文章點(diǎn)贊數(shù) db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) // 計(jì)算每個(gè)作者所寫文檔數(shù)量 // select by_user, count(*) from article group by by_user db.article.aggregate([ { $group: {_id:'$by_user', num:{$sum:1}} } ]) - $avg 計(jì)算集合中所有文檔的所有給定值的平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) - $max 從集合中的所有文檔獲取相應(yīng)值的最大值 // _id:'$by_user'腻要,對應(yīng)按照by_user分組 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) // _id對應(yīng)一個(gè)常量,即所有數(shù)據(jù)的操作 db.article.aggregate([ { $group:{_id:'max', num_likes:{$max:'$likes'}} } ]) - $min 從集合中的所有文檔獲取相應(yīng)值的最小值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) - 例如: db.article.aggregate([{$group:{'_id':'$by_user','num_tutorial':{$sum:1}}}])
七涝登、MongoDB之關(guān)聯(lián)關(guān)系
MongoDB中的關(guān)系表示各個(gè)文檔在邏輯上的相互關(guān)聯(lián)雄家。關(guān)系可以通過嵌入式和引用方法建模。 這種關(guān)系可以是1:1胀滚,1:N趟济,N:1或N:N。
假設(shè)有一種情況:要存儲用戶的地址蛛淋。一個(gè)用戶可以擁有多個(gè)地址咙好,這就是1:N關(guān)系。
// 用戶user文檔
{
"_id":10999110,
"name": "Maxsu",
"contact": "13800138000",
"dob": "1992-10-11"
}
// 地址文檔
{
"_id":12200,
"building": "Hainan Building NO.2100",
"pincode": 571100,
"city": "Haikou",
"province": "Hainan"
}
嵌入式關(guān)系建模
在嵌入式方法中褐荷,我們將地址(address)文檔嵌入到用戶(user)文檔中
{
"_id": 21000100,
"contact": "13800138000",
"dob": "1991-11-11",
"name": "Maxsu",
"address": [
{
"building": "Hainan Building NO.2100",
"pincode": 571100,
"city": "Haikou",
"province": "Hainan"
},
{
"building": "Sanya Building NO.2100",
"pincode": 572200,
"city": "Sanya",
"province": "Hainan"
},
]
}
該方法將所有相關(guān)數(shù)據(jù)保存在單個(gè)文檔中勾效,這使得檢索和維護(hù)更容易。
可以使用單個(gè)查詢來在整個(gè)文檔檢索:
db.users.find( {"name":"Maxsu"},{"address":1, "name":1} )
在上述查詢中叛甫,db和users分別是數(shù)據(jù)庫和集合层宫。缺點(diǎn)是如果嵌入式文檔的大小如果不斷增長,可能會(huì)影響讀/寫性能其监。
建模參考關(guān)系
這是設(shè)計(jì)規(guī)范化關(guān)系的方法萌腿。
在這種方法中,用戶和地址文件將分別維護(hù)抖苦,但用戶文檔將包含一個(gè)將引用地址文檔的id字段的字段毁菱。
{
"_id":ObjectId("52ffc33321332111sdfaf"),
"contact": "13800138000",
"dob": "1991-11-11",
"name": "Maxsu",
"address_ids": [
ObjectId("123123"),
ObjectId("123412")
]
}
用戶文檔包含對應(yīng)地址的ObjectId的數(shù)組字段address_ids。
使用這些ObjectIds锌历,我們可以從那里查詢地址文件并獲取地址詳細(xì)信息贮庞。
使用這種方法,需要兩個(gè)查詢:首先從用戶文檔獲取address_ids字段究西,然后從地址集中獲取這些地址窗慎。
var result = db.users.find({"name":"Maxsu"},{"address_ids":1})
var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})
八、MongoDB與Python的交互
- 安裝
pip3 install pymongo
- 使用
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId
#1.建立連接
#創(chuàng)建MongoClient的對象
#方式一
#特點(diǎn):可以連接默認(rèn)的主機(jī)和端口號
#client = MongoClient()
#方式二
#明確指明主機(jī)和端口號
#client = MongoClient('localhost',27017)
#client = MongoClient(host='localhost',port=27017)
#方式三
#使用MongoDB URI的
client = MongoClient('mongodb://localhost:27017')
#2.獲取數(shù)據(jù)庫
#MongoDB的一個(gè)實(shí)例可以支持多個(gè)獨(dú)立的數(shù)據(jù)庫
#可以通過MongoClient的對象的屬性來訪問數(shù)據(jù)庫
#方式一
db = client.test
print(db)
#方式二
#db = client['test']
#3.獲取集合
#集合是存儲在MongoDb中的一組文檔卤材,可以類似于MySQl中的表
#方式一
collection = db.stuents
#方式二
#collection = db['students']
"""
注意:
MongoDB中關(guān)于數(shù)據(jù)庫和集合的創(chuàng)建都是懶創(chuàng)建
以上的操作在MongoDB的服務(wù)端沒有做任何操作
當(dāng)?shù)谝粋€(gè)文檔被插入集合的時(shí)候才會(huì)創(chuàng)建數(shù)據(jù)庫和集合
"""
#4.文檔
#在pymongo中使用字典來表示文檔
student1 = {
'id':'20180101',
'name':'jack',
'age':20,
'gender':'male'
}
#5.插入文檔
#5.1insert()
#插入單條數(shù)據(jù)
#注意:MongoDb會(huì)自動(dòng)生成一個(gè)ObjectId,insert函數(shù)的返回值為objectid
result = collection.insert(student1)
print(result)
#插入多條數(shù)據(jù)
student2 = {
'id':'20180530',
'name':'tom',
'age':30,
'gender':'male'
}
student3 = {
'id':'20180101',
'name':'bob',
'age':18,
'gender':'male'
}
#result = collection.insert([student2,student3])
#6.查詢文檔
#6.1
#find_one()
result = collection.find_one({'name':'jack'})
print(type(result)) #<class 'dict'>
print(result)
#6.2find()
#需求:查詢年齡為20的數(shù)據(jù)
results = collection.find({'age':20})
print(results)
#Cursor相當(dāng)于是一個(gè)生成器遮斥,只能通過遍歷的方式獲取其中的數(shù)據(jù)
for r in results:
print(r)
#6.3其他用法
#a.count()
#統(tǒng)計(jì)所有數(shù)據(jù)的條數(shù)
count1 = collection.find().count()
#統(tǒng)計(jì)制定條件的數(shù)據(jù)條數(shù)
count1 = collection.find({'age':20}).count()
#7.更新文檔
#7.1update()
conditon = {'name':'jack'}
student = collection.find_one(conditon);
student['age'] = 30
result = collection.update(conditon,student)
#7.2update_one()
conditon = {'name':'jack'}
student = collection.find_one(conditon);
student['age'] = 30
result = collection.update_one(conditon,{'$set':student})
print(result.matched_count,result.modified_count)
#7.3update_many()
#查詢年齡大于20的數(shù)據(jù),然后講年齡增加1
conditon = {'age':{'$gt':20}}
result = collection.update_one(conditon,{'$inc':{'age':1}})
print(result.matched_count,result.modified_count)
#8.刪除文檔
#8.1remove()
#將符合條件的所有的數(shù)據(jù)全部刪除
result = collection.remove({'name':'rose'})
#8.2delete_one()
result = collection.delete_one({'name':'rose'})
#8.3delete_many()
result = collection.delete_many({'name':'rose'})
備注: 默認(rèn)MongoDB是綁定127.0.0.1扇丛,連接遠(yuǎn)程是連接不了的术吗。
編輯MongoDB配置文件: sudo vi /etc/mongodb.conf
找到bind_ip = 127.0.0.1
改為bind_ip = 0.0.0.0
作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處帆精。