MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。php
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。linux
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。git
下載地址:https://www.mongodb.com/downl...web
下載完安裝包,並解壓 tgz(如下演示的是 64 位 Linux上的安裝。sql
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下載 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解壓 sudo mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 將解壓包拷貝到指定目錄
MongoDB 的可執行文件位於 bin
目錄下,因此能夠將其添加到 PATH
路徑中:mongodb
export PATH=<mongodb-install-directory>/bin:$PATH // 即,這樣的 export PATH=/usr/local/mongodb/bin:$PATH
<mongodb-install-directory> 爲你 MongoDB 的安裝路徑。如本文的 /usr/local/mongodb
。shell
MongoDB的數據存儲在data目錄的db目錄下,可是這個目錄在安裝過程不會自動建立,因此你須要手動建立data目錄,並在data目錄中建立db目錄。
如下實例中咱們將data目錄建立於根目錄下(/)。
注意:/data/db 是 MongoDB 默認的啓動的數據庫路徑(--dbpath)。數據庫
mkdir -p /data/db
你能夠再命令行中執行mongo安裝目錄中的bin目錄執行mongod命令來啓動mongdb服務。數組
注意:若是你的
數據庫目錄
不是/data/db
,能夠經過--dbpath
來指定。php7
$ ./mongod
98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission
若是出現這樣的問題,能夠,使用下邊的命令進行權限修改:
sudo chown -R `id -u` /data/db
若是你須要進入MongoDB後臺管理,你須要先打開mongodb裝目錄的下的bin目錄,而後執行mongo命令文件。
MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對MongoDB進行操做和管理的交互式環境。
當你進入mongoDB後臺後,它默認會連接到 test 文檔(數據庫):
重開一個窗口,而後進入MongoDB後臺
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell. ……
讓咱們插入一些簡單的數據,並對插入的數據進行檢索:
> db.corwien.insert({name:'corwien'}) WriteResult({ "nInserted" : 1 }) > db.corwien.find() { "_id" : ObjectId("5942b5a247b748bc9bd3276a"), "name" : "corwien" } >
第一個命令將name 'corwien' 插入到 corwien 集合的 name 字段中。
MongoDB 提供了簡單的 HTTP 用戶界面。 若是你想啓用該功能,須要在啓動的時候指定參數 --rest 。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面訪問端口比服務的端口多1000。
若是你的MongoDB運行端口使用默認的27017,你能夠在端口號爲28017訪問web用戶界面,即地址爲:http://localhost:28017。
無論咱們學習什麼數據庫都應該學習其中的基礎概念,在mongodb中基本的概念是文檔、集合、數據庫,下面咱們挨個介紹。
下表將幫助您更容易理解Mongo中的一些概念:
經過下圖實例,咱們也能夠更直觀的的瞭解Mongo中的一些概念:
一個mongodb中能夠創建多個數據庫。
MongoDB的默認數據庫爲"db",該數據庫存儲在data目錄中。
MongoDB的單個實例能夠容納多個獨立的數據庫,每個都有本身的集合和權限,不一樣的數據庫也放置在不一樣的文件中。
"show dbs" 命令能夠顯示全部數據的列表。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > show dbs local 0.078GB test 0.078GB >
執行 db
命令能夠顯示當前數據庫對象或集合。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > db test >
運行use
命令,能夠鏈接到一個指定的數據庫。
> use local switched to db local > db local >
文檔是一組鍵值(key-value)對(即BSON)。MongoDB 的文檔不須要設置相同的字段,而且相同的字段不須要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 很是突出的特色。
一個簡單的文檔例子以下:
{"site":"www.runoob.com", "name":"菜鳥教程"}
use DATABASE_NAME
若是數據庫不存在,則建立數據庫,不然切換到指定數據庫
。
> use books switched to db books > show dbs local 0.078GB test 0.078GB > db.info.insert({"name":"Jack Ma"}) WriteResult({ "nInserted" : 1 }) > show dbs books 0.078GB local 0.078GB test 0.078GB
能夠看到,咱們剛建立的數據庫 runoob 並不在數據庫的列表中, 要顯示它,咱們須要向 runoob 數據庫插入一些數據。
MongoDB 刪除數據庫的語法格式以下:
db.dropDatabase()
刪除當前數據庫,默認爲 test,你可使用 db
命令查看當前數據庫名。
> show dbs books 0.078GB local 0.078GB test 0.078GB > db.dropDatabase() { "dropped" : "books", "ok" : 1 } > show dbs local 0.078GB test 0.078GB > use test
解釋幾個縮寫吧,省得你們幸苦尋找:
$gt -------- greater than $gte --------- gt equal $lt -------- less than $lte --------- lt equal $ne ----------- not equal
文檔插入數據:
> db.users.insert({"address":{"city":"guangzhou","state":"guangdong"},"tags":["music","cricket","blogs"],}) WriteResult({ "nInserted" : 1 })
查看:
> db.users.find().pretty(); { "_id" : ObjectId("5943a224b4c9662dcc837ba0"), "name" : "kaiyi", "address" : "beijing" } { "_id" : ObjectId("5943b6cfb4c9662dcc837ba1"), "address" : { "city" : "guangzhou", "state" : "guangdong" }, "tags" : [ "music", "cricket", "blogs" ] }
給數組tags 添加索引:
爲數組 tags 建立索引時,會爲 music、cricket、blogs三個值創建單獨的索引。
> db.users.ensureIndex({"tags":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
建立索引後,咱們能夠這樣檢索集合的 tags 字段:
> db.users.find({tags:"cricket"}) { "_id" : ObjectId("5943b6cfb4c9662dcc837ba1"), "address" : { "city" : "guangzhou", "state" : "guangdong" }, "tags" : [ "music", "cricket", "blogs" ] } >
爲了驗證咱們使用使用了索引,可使用 explain 命令:
> db.users.find({tags:"cricket"}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.users", "indexFilterSet" : false, "parsedQuery" : { "tags" : { "$eq" : "cricket" } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "tags" : 1 }, "indexName" : "tags_1", "isMultiKey" : true, "direction" : "forward", "indexBounds" : { "tags" : [ "[\"cricket\", \"cricket\"]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "homestead", "port" : 27017, "version" : "3.0.6", "gitVersion" : "1ef45a23a4c5e3480ac919b28afcba3c615488f2" }, "ok" : 1 } >
其餘查詢語句解釋:
db.col.find({},{"title":1,_id:0}).limit(2)
補充說明:
第一個 {} 放 where 條件,爲空表示返回集合中全部文檔。
第二個 {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)。
> db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" }
想要讀取從 10 條記錄後 100 條記錄,至關於 sql 中limit (10,100)。
> db.COLLECTION_NAME.find().skip(10).limit(100)
以上實例在集合中跳過前面 10 條返回 100 條數據。skip
和 limit
結合就能實現分頁。
當查詢時同時使用sort,skip,limit,不管位置前後 最後執行順序 sort再skip再limit
。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
以上實例相似sql
語句:
select by_user as _id, count(*) as num_tutorial from mycol group by by_user
本文教程只適合在 PHP7 的環境,若是你是 PHP5 環境,你能夠參閱
PHP MongDB 安裝與使用。
咱們使用 pecl 命令來安裝:
文件下載的地址在:
/tmp/pear/download/mongodb-1.2.9.tgz
// $ /usr/local/php7/bin/pecl install mongodb pecl install mongodb
擦,出現這樣的錯誤
sudo apt-get install php7.0-mongodb
on terminal. For the OpenSSL error, try this
sudo apt-get install openssl