MongoDB安裝使用并實現(xiàn)Python操作數(shù)據(jù)庫
一、MongoDB介紹
MongoDB 是一個是一個基于分布式文件存儲的數(shù)據(jù)庫,介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強(qiáng)大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
二、安裝MongoDB
MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進(jìn)行安裝。如果網(wǎng)速太差,并且已經(jīng)下載MongoDB的安裝包時,可以離線方式安裝,參考Ubuntu下MongoDB安裝與使用教程(離線安裝方式)。推薦使用apt-get命令進(jìn)行在線安裝,可以避免很多莫名其妙的問題。
以下命令
sudo apt-get install mongodb
可下載安裝MongoDB,默認(rèn)安裝的版本是MongoDB 2.6.10,但目前MongoDB已經(jīng)升級到3.2.8,這里將指導(dǎo)讀者通過添加軟件源的方式來安裝3.2.8版本。
首先打開終端,導(dǎo)入公共key到包管理器,輸入以下命令:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
創(chuàng)建MongoDB的文件列表
#僅適用于Ubuntu14.04,輸入: echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list 更新包管理器,安裝MongoDB,輸入以下命令: sudo apt-get update sudo apt-get install -y mongodb-org
注意:如果執(zhí)行“sudo apt-get update”命令后出現(xiàn)如下錯誤:
···
update completed, but some metadata was ignored due to errors.
E: 無法獲得鎖 /var/lib/dpkg/lock – open (11: 資源暫時不可用)
E: 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進(jìn)程正占用它?
···
請按照如下方法解決錯誤,也就是輸入以下三條命令:
sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo apt-get update
運行上面三條命令以后,應(yīng)該就可以順利完成apt-get update了。
安裝完成MongoDB以后,在終端輸入以下命令查看MongoDB版本:
mongo -version
輸出版本信息,表明安裝成功。
啟動和關(guān)閉mongodb命令如下:
sudo service mongodb start sudo service mongodb stop
默認(rèn)設(shè)置MongoDB是隨Ubuntu啟動自動啟動的。
輸入以下命令查看是否啟動成功:
pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯?dāng)?shù)字1
查看是否啟動成功
出現(xiàn)安裝錯誤的解決方案:
輸入“sudo service mongodb start”啟動mongodb的時候,如果報這個錯誤:Failed to start mongod.service: Unit not found
請按照如下步驟解決該錯誤:
(1)使用vim編輯器創(chuàng)建配置文件
sudo vim /etc/systemd/system/mongodb.service
(2)在該配置文件中添加如下內(nèi)容:
[Unit] Description=High-performance, schema-free document-oriented database After=network.target [Service] User=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target
保存退出vim編輯器。
(3)輸入如下命令啟動mongodb:
sudo systemctl start mongodb sudo systemctl status mongodb
這時就可以啟動成功了。
以后,每次啟動和關(guān)閉MongoDB,就可以仍然使用如下命令:
sudo service mongodb start sudo service mongodb stop
三、使用MongoDB
shell命令模式
輸入如下命令進(jìn)入MongoDB的shell命令模式:
mongo 或者:sudo mongo
默認(rèn)連接的數(shù)據(jù)庫是test數(shù)據(jù)庫,在此之前一定要確保你已經(jīng)啟動了MongoDB,否則會出現(xiàn)錯誤,啟動之后運行成功,如下
mongo shell常用操作命令:
數(shù)據(jù)庫相關(guān) show dbs:顯示數(shù)據(jù)庫列表 show collections:顯示當(dāng)前數(shù)據(jù)庫中的集合(類似關(guān)系數(shù)據(jù)庫中的表table) show users:顯示所有用戶 use yourDB:切換當(dāng)前數(shù)據(jù)庫至yourDB db.help() :顯示數(shù)據(jù)庫操作命令 db.yourCollection.help() :顯示集合操作命令,yourCollection是集合名
MongoDB沒有創(chuàng)建數(shù)據(jù)庫的命令,如果你想創(chuàng)建一個“School”的數(shù)據(jù)庫,先運行use School命令,之后做一些操作(如:創(chuàng)建聚集集合db.createCollection(‘teacher')),這樣就可以創(chuàng)建一個名叫“School”的數(shù)據(jù)庫。
自動創(chuàng)建school數(shù)據(jù)庫
下面以一個School數(shù)據(jù)庫為例,在School數(shù)據(jù)庫中創(chuàng)建兩個集合teacher和student,并對student集合中的數(shù)據(jù)進(jìn)行增刪改查基本操作(集合Collection相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表table)。
1、切換到School數(shù)據(jù)庫
use School #切換到School數(shù)據(jù)庫。MongoDB 無需預(yù)創(chuàng)建School數(shù)據(jù)庫,在使用時會自動創(chuàng)建
2、創(chuàng)建集合Collection
本章節(jié)我們?yōu)榇蠹医榻B如何使用 MongoDB 來創(chuàng)建集合。
MongoDB 中使用 createCollection() 方法來創(chuàng)建集合。
語法格式:
db.createCollection(name, options)
參數(shù)說明:
name: 要創(chuàng)建的集合名稱
options: 可選參數(shù), 指定有關(guān)內(nèi)存大小及索引的選項
options 可以是如下參數(shù):
在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,然后檢查 max 字段。
實例
在 test 數(shù)據(jù)庫中創(chuàng)建 runoob 集合: > use test switched to db test > db.createCollection("runoob") { "ok" : 1 } > 如果要查看已有集合,可以使用 show collections 命令: > show collections runoob system.indexes 下面是帶有幾個關(guān)鍵參數(shù)的 createCollection() 的用法: 創(chuàng)建固定集合 mycol,整個集合空間大小 6142800 KB, 文檔最大個數(shù)為 10000 個。 > db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } ) { "ok" : 1 } > 在 MongoDB 中,你不需要創(chuàng)建集合。當(dāng)你插入一些文檔時,MongoDB 會自動創(chuàng)建集合。 > db.mycol2.insert({"name" : "菜鳥教程"}) > show collections mycol2 ... ##創(chuàng)建一個聚集集合。MongoDB 其實在插入數(shù)據(jù)的時候,也會自動創(chuàng)建對應(yīng)的集合,無需預(yù)先創(chuàng)建
幾種重要的數(shù)據(jù)類型。
ObjectId
ObjectId 類似唯一主鍵,可以很快的去生成和排序,包含 12 bytes,含義是:
前 4 個字節(jié)表示創(chuàng)建 unix時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時
接下來的 3 個字節(jié)是機(jī)器標(biāo)識碼
緊接的兩個字節(jié)由進(jìn)程 id 組成 PID
最后三個字節(jié)是隨機(jī)數(shù)
MongoDB 中存儲的文檔必須有一個 _id 鍵。這個鍵的值可以是任何類型的,默認(rèn)是個 ObjectId 對象
由于 ObjectId 中保存了創(chuàng)建的時間戳,所以你不需要為你的文檔保存時間戳字段,你可以通過 getTimestamp 函數(shù)來獲取文檔的創(chuàng)建時間:
> var newObject = ObjectId() > newObject.getTimestamp() ISODate("2017-11-25T07:21:10Z") ObjectId 轉(zhuǎn)為字符串 > newObject.str 5a1919e63df83ce79df8b38f 字符串 BSON 字符串都是 UTF-8 編碼。
時間戳
BSON 有一個特殊的時間戳類型用于 MongoDB 內(nèi)部使用,與普通的日期類型不相關(guān)。 時間戳值是一個 64 位的值。其中:
前32位是一個 time_t 值(與Unix新紀(jì)元相差的秒數(shù))
后32位是在某秒中操作的一個遞增的序數(shù)
在單個 mongod 實例中,時間戳值通常是唯一的。
在復(fù)制集中, oplog 有一個 ts 字段。這個字段中的值使用BSON時間戳表示了操作時間。
BSON 時間戳類型主要用于 MongoDB 內(nèi)部使用。在大多數(shù)情況下的應(yīng)用開發(fā)中,你可以使用 BSON 日期類型。
日期
表示當(dāng)前距離 Unix新紀(jì)元(1970年1月1日)的毫秒數(shù)。日期類型是有符號的, 負(fù)數(shù)表示 1970 年之前的日期。
> var mydate1 = new Date() //格林尼治時間 > mydate1 ISODate("2018-03-04T14:58:51.233Z") > typeof mydate1 object > var mydate2 = ISODate() //格林尼治時間 > mydate2 ISODate("2018-03-04T15:00:45.479Z") > typeof mydate2 object 這樣創(chuàng)建的時間是日期類型,可以使用 JS 中的 Date 類型的方法。 返回一個時間類型的字符串: > var mydate1str = mydate1.toString() > mydate1str Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) > typeof mydate1str string 或者 > Date() Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)
1、插入數(shù)據(jù)
與數(shù)據(jù)庫創(chuàng)建類似,插入數(shù)據(jù)時也會自動創(chuàng)建集合。
插入數(shù)據(jù)有兩種方式:insert和save。
db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可選 db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可選
這兩種方式,其插入的數(shù)據(jù)中_id字段均可不寫,會自動生成一個唯一的_id來標(biāo)識本條數(shù)據(jù)。而insert和save不同之處在于:在手動插入_id字段時,如果_id已經(jīng)存在,insert不做操作,save做更新操作;如果不加_id字段,兩者作用相同點都是插入數(shù)據(jù)。
insert和save添加的數(shù)據(jù)其結(jié)構(gòu)是松散的,列屬性均不固定,根據(jù)添加的數(shù)據(jù)為準(zhǔn)。先定義數(shù)據(jù)再插入,就可以一次性插入多條數(shù)據(jù),
插入多條
運行完以上例子,student 已自動創(chuàng)建,這也說明 MongoDB 不需要預(yù)先定義 collection ,在第一次插入數(shù)據(jù)后,collection 會自動的創(chuàng)建。
2、查找數(shù)據(jù)
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結(jié)構(gòu)化的方式來顯示所有文檔。
語法
MongoDB 查詢數(shù)據(jù)的語法格式如下:
db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
如果你需要以易讀的方式來讀取數(shù)據(jù),可以使用 pretty() 方法,語法格式如下:>db.col.find().pretty()
pretty() 方法以格式化的方式來顯示所有文檔。
除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過下表可以更好的理解 MongoDB 的條件語句查詢:
MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規(guī) SQL 的 AND 條件。
語法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 條件
MongoDB OR 條件語句使用了關(guān)鍵字 $or,語法格式如下:
db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
AND 和 OR 聯(lián)合使用
以下實例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語句為: ‘where likes>50 AND (by = ‘菜鳥教程' OR title = ‘MongoDB 教程')'
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
3、更新數(shù)據(jù)
MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓我們詳細(xì)來看下兩個函數(shù)的應(yīng)用及其區(qū)別。
update() 方法
update() 方法用于更新已存在的文檔。語法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
參數(shù)說明:
query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
update : update的對象和一些更新的操作符(如 set, s e t , inc…)等,也可以理解為sql update查詢內(nèi)set后面的
upsert : 可選,這個參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級別。
實例
我們在集合 col 中插入如下數(shù)據(jù):
>db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
接著我們通過 update() 方法來更新標(biāo)題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) ##加$set 用處:僅修改目標(biāo)行,否則不會保留其他行。 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息 > db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } > #可以看到標(biāo)題(title)由原來的 "MongoDB 教程" 更新為了 "MongoDB"。
以上語句只會修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法
save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save( <document>, { writeConcern: <document> } )
參數(shù)說明:
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級別。
實例
以下實例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):
>db.col.save({ "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "Runoob", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }) 替換成功后,我們可以通過 find() 命令來查看替換后的數(shù)據(jù) >db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "Runoob", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } >
更多實例
只更新第一條記錄:
db.col.update( { "cou
全部更新:
db.col.update( { "cou
只添加第一條:
db.col.update( { "cou
全部添加加進(jìn)去:
db.col.update( { "cou
全部更新:
db.col.update( { "cou
只更新第一條記錄:
db.col.update( { "cou
4、刪除數(shù)據(jù)
在前面的幾個章節(jié)中我們已經(jīng)學(xué)習(xí)了MongoDB中如何為集合添加數(shù)據(jù)和更新數(shù)據(jù)。在本章節(jié)中我們將繼續(xù)學(xué)習(xí)MongoDB集合的刪除。
MongoDB remove()函數(shù)是用來移除集合中的數(shù)據(jù)。
MongoDB數(shù)據(jù)更新可以使用update()函數(shù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來判斷執(zhí)行的條件是否正確,這是一個比較好的習(xí)慣。
語法
remove() 方法的基本語法格式如下所示:
db.collection.remove( <query>, <justOne> )
如果你的 MongoDB 是 2.6 版本以后的,語法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
參數(shù)說明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個文檔。
writeConcern :(可選)拋出異常的級別。
實例
以下文檔我們執(zhí)行兩次插入操作:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
使用 find() 函數(shù)查詢數(shù)據(jù):
> db.col.find() { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } 接下來我們移除 title 為 'MongoDB 教程' 的文檔: >db.col.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數(shù)據(jù) >db.col.find() …… # 沒有數(shù)據(jù) 如果你只想刪除第一條找到的記錄可以設(shè)置 justOne 為 1,如下所示: >db.COLLECTION_NAME.remove(DELETION_CRITERIA,1) 如果你想刪除所有數(shù)據(jù),可以使用以下方式(類似常規(guī) SQL 的 truncate 命令): >db.col.remove({}) >db.col.find() >
5、條件運算符
條件操作符用于比較兩個表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)。
MongoDB中條件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
我們使用的數(shù)據(jù)庫名稱為”runoob” 我們的集合名稱為”col”,以下為我們插入的數(shù)據(jù)。
為了方便測試,我們可以先使用以下命令清空集合 “col” 的數(shù)據(jù):
db.col.remove({})
插入以下數(shù)據(jù)
>db.col.insert({ title: 'PHP 教程', description: 'PHP 是一種創(chuàng)建動態(tài)交互性站點的強(qiáng)有力的服務(wù)器端腳本語言。', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['php'], likes: 200 }) >db.col.insert({title: 'Java 教程', description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['java'], likes: 150 }) >db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb'], likes: 100 })
使用find()命令查看數(shù)據(jù):
db.col.find()
MongoDB (>) 大于操作符 - $gt
如果你想獲取 “col” 集合中 “l(fā)ikes” 大于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({"likes" : {$gt : 100}}) 類似于SQL語句: Select * from col where likes > 100; 輸出結(jié)果: > db.col.find({"likes" : {$gt : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } > MongoDB(>=)大于等于操作符 - $gte 如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令: db.col.find({likes : {$gte : 100}}) 類似于SQL語句: Select * from col where likes >=100; 輸出結(jié)果: > db.col.find({likes : {$gte : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } > MongoDB (<) 小于操作符 - $lt 如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令: db.col.find({likes : {$lt : 150}}) 類似于SQL語句: Select * from col where likes < 150; 輸出結(jié)果: > db.col.find({likes : {$lt : 150}}) { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } MongoDB (<=) 小于操作符 - $lte 如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令: db.col.find({likes : {$lte : 150}}) 類似于SQL語句: Select * from col where likes <= 150; 輸出結(jié)果: > db.col.find({likes : {$lte : 150}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt 如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令: db.col.find({likes : {$lt :200, $gt : 100}}) 類似于SQL語句: Select * from col where likes>100 AND likes<200; 輸出結(jié)果: > db.col.find({likes : {$lt :200, $gt : 100}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } >
6、MongoDB Limit與Skip方法
MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語法
limit()方法基本語法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER)
實例
集合 col 中的數(shù)據(jù)如下:
db.col.find({},{"title":1,_id:0}).limit(2) # _id:0(投影1:表示顯示0:表示隱藏) { "title" : "PHP 教程" } { "title" : "Java 教程" } 注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
MongoDB Skip() 方法
我們除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)。
db.col.find({},{"title":1,_id:0}).limit(2) # _id:0(投影1:表示顯示0:表示隱藏) { "title" : "PHP 教程" } { "title" : "Java 教程" } 注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
7.MongoDB排序
MongoDB sort()方法 在MongoDB中使用使用sort()方法對數(shù)據(jù)進(jìn)行排序,sort()方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。 語法 sort()方法基本語法如下所示: >db.COLLECTION_NAME.find().sort({KEY:1}) 實例 col 集合中的數(shù)據(jù)如下: { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設(shè)計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } 以下實例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列: >db.col.find({},{"title":1,_id:0}).sort({"likes":-1}) { "title" : "PHP 教程" } { "title" : "Java 教程" } { "title" : "MongoDB 教程" } >
8.MongoDB索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時,查詢可以要花費幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中,索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)
ensureIndex() 方法
MongoDB使用 ensureIndex() 方法來創(chuàng)建索引。
語法
ensureIndex()方法基本語法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1})
語法中 Key 值為你要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為-1即可。
實例
db.col.ensureIndex({"title":1})
ensureIndex() 方法中你也可以設(shè)置使用多個字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引)。
db.col.ensureIndex({"title":1,"description":-1})
ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:
實例在后臺創(chuàng)建索引:
db.values.ensureIndex({open: 1, close: 1}, {background: true})
通過在創(chuàng)建索引時加background:true 的選項,讓創(chuàng)建工作在后臺執(zhí)行
8.MongoDB 聚合
MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計平均值,求和等),并返回計算后的數(shù)據(jù)結(jié)果。有點類似sql語句中的 count(*)。
aggregate() 方法
MongoDB中聚合的方法使用aggregate()。
語法
aggregate() 方法的基本語法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
實例
集合中的數(shù)據(jù)如下: { _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 }, 現(xiàn)在我們通過以上集合計算每個作者所寫的文章數(shù),使用aggregate()計算結(jié)果如下: ## _id 指定根據(jù)那個屬性分組 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "runoob.com", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 } 以上實例類似sql語句: select by_user, count(*) from mycol group by by_user
在上面的例子中,我們通過字段by_user字段對數(shù)據(jù)進(jìn)行分組,并計算by_user字段相同值的總和。
下表展示了一些聚合的表達(dá)式:
管道的概念
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的參數(shù)。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理。管道操作是可以重復(fù)的。
表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無狀態(tài)的,只能用于計算當(dāng)前聚合管道的文檔,不能處理其它的文檔。
這里我們介紹一下聚合框架中常用的幾個操作:
project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛?、增加或刪除域,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔。 p r o j e c t : 修 改 輸 入 文 檔 的 結(jié) 構(gòu) 。 可 以 用 來 重 命 名 、 增 加 或 刪 除 域 , 也 可 以 用 于 創(chuàng) 建 計 算 結(jié) 果 以 及 嵌 套 文 檔 。 match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。 match使用MongoDB的標(biāo)準(zhǔn)查詢操作。 m a t c h 使 用 M o n g o D B 的 標(biāo) 準(zhǔn) 查 詢 操 作 。 limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。 s k i p : 在 聚 合 管 道 中 跳 過 指 定 數(shù) 量 的 文 檔 , 并 返 回 余 下 的 文 檔 。 unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值。
group:將集合中的文檔分組,可用于統(tǒng)計結(jié)果。 g r o u p : 將 集 合 中 的 文 檔 分 組 , 可 用 于 統(tǒng) 計 結(jié) 果 。 sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實例
1、$project實例 db.article.aggregate( { $project : { title : 1 , author : 1 , }} ); 這樣的話結(jié)果中就只還有_id,tilte和author三個字段了,默認(rèn)情況下_id字段是被包含的,如果要想不包含_id話可以這樣: db.article.aggregate( { $project : { _id : 0 , title : 1 , author : 1 }}); 2.$match實例 db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } },{ $group: { _id: null, count: { $sum: 1 } } } ] ); $match用于獲取分?jǐn)?shù)大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進(jìn)行處理。 3.$skip實例 db.article.aggregate( { $skip : 5 }); 經(jīng)過$skip管道操作符處理后,前五個文檔被"過濾"掉。
四 Python操作MongoDB
安裝PyMongo模塊
pip install pymongo
使用MongoClient建立連接
from pymongo import MongoClient #鏈接格式 mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb:// 這是固定的格式,必須要指定。 username:password@ 可選項,如果設(shè)置,在連接數(shù)據(jù)庫服務(wù)器之后,驅(qū)動都會嘗試登陸這個數(shù)據(jù)庫 host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連接服務(wù)器的地址。如果要連接復(fù)制集,請指定多個主機(jī)地址。 portX 可選的指定端口,如果不填,默認(rèn)為27017 /database 如果指定username:password@,連接并驗證登陸指定數(shù)據(jù)庫。若不指定,默認(rèn)打開 test 數(shù)據(jù)庫。 ?options 是連接選項。如果不使用/database,則前面需要加上/。所有連接選項都是鍵值對name=value,鍵值對之間通過&或;(分號)隔開 # 以下為三種建立無驗證連接的方式 #client = MongoClient() #client = MongoClient('localhost', 27017) #client = MongoClient('mongodb://localhost:27017/') #建立驗證連接 使用用戶 admin 使用密碼 123456 連接到本地的 MongoDB 服務(wù)上。輸出結(jié)果如下所示: > mongodb://admin:123456@localhost/ ... 使用用戶名和密碼連接登陸到指定數(shù)據(jù)庫,格式如下: mongodb://admin:123456@localhost/test
獲取數(shù)據(jù)庫
# 以下是兩種獲取數(shù)據(jù)庫的方式 db = client.pythondb db = client['python-db']
獲取集合
# 以下是兩種獲取集合的方式 collection = db.python_collection collection = db['python-collection']
上述任何命令都沒有在MongoDB服務(wù)器上實際執(zhí)行任何操作。當(dāng)?shù)谝粋€文檔插入集合時才創(chuàng)建集合和數(shù)據(jù)庫。
插入文檔
#!/usr/bin/python3 #coding=utf-8 import datetime from pymongo import MongoClient client = MongoClient() db = client.pythondb posts = db.posts post = {"author": "Maxsu", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()} posts.insert(post)
# 批量插入,參數(shù)為list posts.insert_many(new_posts)
查找文檔
#!/usr/bin/python3 #coding=utf-8 import datetime import pprint from pymongo import MongoClient client = MongoClient() db = client.pythondb posts = db.posts # 查找單個文檔 print(posts.find_one()) # 查找多個文檔 for post in posts.find(): print(post) # 計數(shù)統(tǒng)計 print(posts.count()) print(posts.find({"author": "Maxsu"}).count())
到此這篇關(guān)于MongoDB安裝使用并實現(xiàn)Python操作數(shù)據(jù)庫 的文章就介紹到這了,更多相關(guān)MongoDB安裝使用內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。