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