摘要:可選,拋出異常的級別。示例教程更新一條數據標題。命令行下執行進入數據庫進入庫可查看當前庫用戶列表執行新建用戶設置賬戶密碼,并指定級別。重啟服務重新進入數據庫,發現命令無法執行,報權限不足錯誤。命令可以正常執行。
1.MongoDB 簡介
MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。
在高負載的情況下,添加更多的節點,可以保證服務器性能。
MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似于JSON對象。字段值可以包含其他文檔,數組及文檔數組。
MongoDB 和關系型數據庫相關概念關系對照表:
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table | joins | 表連接,MongoDB不支持 |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
use DATABASE_NAME :如果數據庫不存在,則創建數據庫,否則切換到指定數據庫
db.getName() 或 db:當前正在使用的數據庫
show dbs:查詢所有數據庫
db.dropDatabase():刪除當前數據庫,默認為 test。其他庫先切換。
db.collection.drop():刪除集合。collection為集合名稱。
show tables 或 show collection :查詢當前庫下所有集合。
db.createCollection(name, options):創建集合。name: 要創建的集合名稱;options: 可選參數, 指定有關內存大小及索引的選項.例:db.createCollection("runoob")
如果 mongo shell不接受集合的名稱,例如如果名稱中包含空格,連字符”-“,或者以數字開始,你可以使用代替語法來指代集合,如下所示:
>db["3test"].find() db.getCollection("3test").find()
db.stats() 查看數據庫使用狀態的統計信息。
>db.stats() { "db":"test", --查看的是哪個數據庫 "collections":7, --collection數量 "objects":28, --當前數據庫中所有集合中的對象數(即文檔)的數量。 "avgObjSize":50.57142857142857, --對象平均大小,以字節為單位 "dataSize":1416, --數據大小 "storageSize":31744, --數據大小(含預分配空間) "numExtents":7, --事件數量 "indexes":7, --索引數量 "indexSize":57344, --索引大小 "fileSize":50331648, --文件大小 "ok":1 --本次取stats是否正常 }
插入(Create)
簡述:文檔的數據結構和JSON基本一樣。所有存儲在集合中的數據都是BSON格式。是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。命令格式如下:
db.COLLECTION_NAME.insert(document)
例: >db.col.insert({title: "MongoDB 教程", description: "MongoDB 是一個 Nosql 數據庫", by: "菜鳥教程", url: "http://www.runoob.com", tags: ["mongodb", "database", "NoSQL"], likes: 100 })
插入的時候如果集合不存在,那么插入操作會創建集合。
_id 字段:在MongoDB中,存儲于集合中的每一個文檔都需要一個唯一的 _id 字段作為 primary_key。如果一個插入文檔操作遺漏了_id 字段,MongoDB驅動會自動為_id字段生成一個 ObjectId。
這種情況同樣適用于通過帶有參數 upsert: true 的update操作來插入文檔的情況。ObjectId:
MongoDB采用了一個稱之為ObjectId的類型來做主鍵。ObjectId是一個12字節的 BSON 類型字符串,BSON字符串都是UTF-8編碼。按照字節順序,從開頭依次表示:4字節:UNIX時間戳
3字節:表示運行MongoDB的機器的標識符
2字節:表示生成此_id的進程
3字節:由一個隨機數開始的計數器生成的值
db.collection.insertOne() : 向集合插入單個文檔。
db.collection.insertMany(): 向集合插入多個文檔。
更新(Update)
命令格式如下:
db.collection.update(, // update的查詢條件,類似sql update查詢內where后面的。 , //update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update 查詢內set后面的 { upsert: , //可選,這個參數的意思是,如果不存在"update的記錄,是否插入objNew,true為插入,默認是false,不插入 multi: , // 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。 writeConcern: //可選,拋出異常的級別。 } )
示例:
db.col.update({"title":"MongoDB 教程"},{$set:{"title":"MongoDB"}})更新一條數據標題(title)。
默認情況下, db.collection.update() 只更新一個文檔。要更新多個文檔,請使用 multi 選項設置 multi 參數為 true。
save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save(,//文檔數據。 { writeConcern: //可選,拋出異常的級別。 } )
_id 字段一旦設定,你不能更新 _id 字段的值,你也不能用有不同 _id 字段值的替換文檔來替換已經存在的文檔。
其他命令:
db.collection.updateOne()即使可能有多個文檔通過過濾條件匹配到,但是也最多也只更新一個文檔。
db.collection.updateMany()更新所有通過過濾條件匹配到的文檔。
db.collection.replaceOne()即使可能有多個文檔通過過濾條件匹配到,但是也最多也只替換一個文檔。
查詢(Retrieve)
db.collection.find(query, projection) 方法從集合中讀取文檔,省略過濾條件則是查詢所有文檔;collection是文檔名稱。
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。
db.collection.find().pretty() :pretty()方法以格式化的方式來顯示所有文檔。
除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較
操作 | 格式 | 范例 | RDBMS中的類似語句 |
---|---|---|---|
等于 | { |
db.col.find({"by":"菜鳥教程"}).pretty() | where by = "菜鳥教程" |
小于 | { |
db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | { |
db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | { |
db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | { |
db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | { |
db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
包含 | { |
db.col.find("likes":{$in:[2,4,6]}).pretty() | where likes in(2,4,6) |
不包含 | { |
db.col.find("likes":{$nin:[2,4,6]}).pretty() | where likes not in(2,4,6) |
MongoDB AND 條件
find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。
db.col.find( { "by":"菜鳥教程", "title":"MongoDB 教程" } ).pretty()
MongoDB OR 條件
OR 條件語句使用了關鍵字 $or,語法格式如下
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
>db.col.find( { $or:[ {"by":"菜鳥教程"}, {"title": "MongoDB 教程"} ] } ).pretty()
AND 和 OR 聯合使用
>db.col.find( {"likes": {$gt:50}, $or: [ {"by": "菜鳥教程"}, {"title": "MongoDB 教程"} ] } ).pretty()
projection 參數的使用方法
db.collection.find(query, projection)
若不指定 projection,則默認返回所有鍵,指定 projection 格式如下,有兩種模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
_id 鍵默認返回,需要主動指定 _id:0 才會隱藏
兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應返回)
db.collection.find(query, {title: 1, by: 0}) // 錯誤
只能全1或全0,除了在inclusion模式時可以指定_id為0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確
刪除(Delete)
MongoDB remove()函數是用來移除集合中的數據。在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
remove() 方法的基本語法格式如下所示:
db.collection.remove(, //(可選)刪除的文檔的條件。 { justOne: , //(可選)如果設為 true 或 1,則只刪除一個文檔。 writeConcern: //(可選)拋出異常的級別。 } )
現在官方推薦使用 deleteOne() 和 deleteMany() 方法。
db.inventory.deleteMany({}):刪除集合下全部文檔。例如:
刪除 status 等于 A 的全部文檔: db.inventory.deleteMany({ status : "A" }) 刪除 status 等于 D 的一個文檔: db.inventory.deleteOne( { status: "D" } )
安裝完成之后,Windows下是不會自動生成配置文件,也沒有進程。
新建配置文件
在mongodb的安裝目錄下,如 C:Program FilesMongoDBServer3.6 新建conf目錄并新建mongod.conf文件,配置內容如下:
systemLog: #日志文件 destination: file path: F:mongoDBlogsmongod.log logAppend: true storage: #數據存儲路徑 dbPath: F:datadb journal: enabled: true net:#綁定ip及端口 bindIp: 127.0.0.1 port: 27017 setParameter: enableLocalhostAuthBypass: true #security:#安全認證 #authorization: enabledlog文件也是不存在的,根據自己的需要在相應的目錄下新建mongod.log文件。
開啟認證及生成守護進程
mongod --auth --config "C:Program FilesMongoDBServer3.6confmongod.conf" --install --serviceName "MongoD
--auth : 開啟認證
--serviceName "MongoDB":生成名稱為MongoDB的守護進程
特別注意:帳號是跟著庫走的,所以在指定庫里授權,必須也在指定庫里驗證(auth)。
配置之前先配置文件不要開啟auth認證,默認為關閉狀態。否則進入查看數據庫會權限不足。
命令行下執行`mongo 進入數據庫
use admin 進入admin庫
db.getUsers() 可查看當前庫用戶列表
執行db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] }) 新建用戶設置賬戶密碼,并指定級別。
關于授權:
roles:指定用戶的角色,可以用一個空數組給新用戶設定空角色;在roles字段,可以指定內置角色和用戶定義的角色。
**role里的可選角色**:
Built-In Roles(內置角色):
數據庫用戶角色:read、readWrite;
數據庫管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
備份恢復角色:backup、restore;
所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級用戶角色:root (有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase))
內部角色:__system
具體角色權限:
Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限
修改配置文件:sudo vim /etc/mongodb.conf
security: authorization: enabled //注意縮進,縮進參照配置文件其他配置??s進錯誤可能重啟不成功
去掉前面的 # 號。
重啟mongo服務
/etc/init.d/mongodb restart
重新進入數據庫,發現命令無法執行,報權限不足錯誤。切換到admin庫use admin(哪里創建的用戶切換到哪個庫),執行db.auth("admin","admin") 返回1,是認證成功。命令可以正常執行。
注意:MongoDB創建用戶在命令行下,并且制定用戶可以操作那些庫
Windows 安裝 MongoDB PHP擴展
MongoDB PHP擴展下載地址
"Thread safe"(線程安全)是運行在Apache上以模塊的PHP上,如果你以CGI的模式運行PHP,請選擇非線程安全模式(" non-thread safe")。
版本選擇參考:
下載完你需要的二進制包后,解壓壓縮包,將"php_mongo.dll"文件添加到你的PHP擴展目錄中(ext)。ext目錄通常在PHP安裝目錄下的ext目錄。然后php.ini中打開
重啟服務器。
通過瀏覽器訪問phpinfo,如果安裝成功,就會看到類型以下的信息:
Linux上安裝 MongoDB PHP擴展
linux中執行以下命令來安裝MongoDB 的 PHP7 擴展驅動
$ /usr/local/php7/bin/pecl install mongodb
執行成功后,會輸出以下結果:
…… Build process completed successfully Installing "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/mongodb.so" install ok: channel://pecl.php.net/mongodb-1.1.7 configuration option "php_ini" is not set to php.ini location You should add "extension=mongodb.so" to php.ini
下來我們打開 php.ini 文件,添加 extension=mongodb.so 配置。
可以直接執行以下命令來添加。
$ echo "extension=mongodb.so" >> `/usr/local/php7/bin/php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||"`
注意:以上執行的命令中 php7 的安裝目錄為 /usr/local/php7/,如果你安裝在其他目錄,需要相應修改 pecl 與 php 命令的路徑。 使用php的pecl安裝命令必須保證網絡連接可用以及root權限。
如果你的php是自己編譯的,則安裝方法如下(假設是編譯在/usr/local/php目錄中) github地址:
$ git clone https://github.com/mongodb/mongo-php-driver.git $ cd mongo-php-driver $ git submodule sync && git submodule update --init $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config $ make all -j 5 $ sudo make install
執行以上命令后,你需要修改php.ini文件,在php.ini文件中添加mongo配置,
配置如下: extension=mongo.so
注意:你需要指明 extension_dir 配置項的路徑。
php例子:
insert(["x" => 1, "name"=>"菜鳥教程", "url" => "http://www.runoob.com"]); $bulk->insert(["x" => 2, "name"=>"Google", "url" => "http://www.google.com"]); $bulk->insert(["x" => 3, "name"=>"taobao", "url" => "http://www.taobao.com"]); $manager->executeBulkWrite("test.sites", $bulk); $filter = ["x" => ["$gt" => 1]]; //字段名及匹配條件 $options = [ "projection" => ["_id" => 0], // 指定返回鍵,參考上面**projection用法** "sort" => ["x" => -1], //排序字段,1是正序,-1是倒序 ]; // 查詢數據 $query = new MongoDBDriverQuery($filter, $options); $cursor = $manager->executeQuery("test.sites", $query); foreach ($cursor as $document) { print_r($document); } ?>8. MongoDB備份與恢復
在Mongodb中我們使用mongodump命令來備份MongoDB數據。該命令可以導出所有數據到指定目錄中。
> mongodump -h HOST_NAME -d DB_NAME -o BACKUP_DIRECTORY
> mongodump --host HOST_NAME --port PORT_NUMBER -d DB_NAME -o BACKUP_DIRECTORY示例:備份單庫
vagrant@homestead:~$ mongodump -h 127.0.0.1 -d DB_NAME -o /root/dbBackup/mongoDB/dbBackupName_$(date +"%Y-%m-%d_%H")也可以備份指定文檔:
> mongodump -h dbhost --collection COLLECTION -d DB_NAME -o BACKUP_DIRECTORY
>mongorestore -h<:port> -d dbname --host <:port>, -h <:port>:
MongoDB所在服務器地址,默認為: localhost:27017
--db , -d :
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,這份備份文件之后添加或修改的數據都會被刪除,慎用哦!:
mongorestore 最后的一個參數,設置備份數據所在位置,例如:c:datadumptest。
你不能同時指定和 --dir 選項,--dir也可以設置備份目錄。
--dir:
指定備份的目錄
你不能同時指定和 --dir 選項。
示例:
vagrant@homestead:~$ /usr/local/mongodb/bin/mongodump -h 127.0.0.1:27117 -u USER_NAME -p PASSWORD -d DB_NAME -o /BACK_DIRECTORY/BACKUP_DB_NAME9. 錯誤
沒有 phpize 命令
執行: sudo apt install php7.2-dev
錯誤:
The SCRAM_SHA_1 authentication mechanism requires libmongoc built with ENABLE_SSL
方法:
sudo apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev sudo pecl install mongodb
安裝后別忘記在 php.ini 中添加 extension=mongodb.so
重啟:sudo service php7.2-fpm restart
參考:菜鳥教程
MongoDB中文社區
MongoDB官方文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19231.html
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:前兩篇教程我們介紹了如何搭建的本地環境最簡單的入門教程之一環境搭建以及如何用讀取里的記錄最簡單的入門教程之二使用訪問這篇教程我們會介紹如何使用代碼來連接。代碼如下和教程二相比,上述代碼的方法里還展示了如何用代碼給數據庫里增加記錄。 前兩篇教程我們介紹了如何搭建MongoDB的本地環境: MongoDB最簡單的入門教程之一 環境搭建 以及如何用nodejs讀取MongoDB里的記錄: M...
摘要:通過前面四篇的學習,我們已經在本地安裝了一個數據庫,并且通過一個簡單的應用的單元測試,插入了幾條記錄到中,并通過查看到了插入的數據。讀操作最終將會使用我們在最簡單的入門教程之三使用代碼往里插入數據里介紹的方法,即通過注入的實例完成對的操作。 通過前面四篇的學習,我們已經在本地安裝了一個MongoDB數據庫,并且通過一個簡單的Spring boot應用的單元測試,插入了幾條記錄到Mong...
閱讀 2596·2023-04-25 15:07
閱讀 705·2021-11-24 10:21
閱讀 2299·2021-09-22 10:02
閱讀 3517·2019-08-30 15:43
閱讀 3222·2019-08-30 13:03
閱讀 2287·2019-08-29 17:18
閱讀 3586·2019-08-29 17:07
閱讀 1873·2019-08-29 12:27