一:下載、安裝、配置、使用
為了方便下載,我把當時下載的這個解壓包,放在百度的雲盤上。
1、百度鏈接:https://pan.baidu.com/s/1xhFsENTVvU-tnjK9ODJ7Ag 密碼:ctyy
2、官方安裝下載鏈接:https://www.mongodb.com/download-center?jmp=nav#community
點擊DOWNLOAD按鈕,開始下載
不過值得注意的是,上次測試了最新版本,在官網下載安裝之后沒有mongo.exe和mongod.exe
因此我又卸載了官網版本,使用解壓包重新安裝,解壓包版本如下:
有興趣的話還是可以從官網下載,然后觀察下差異
安裝過程一路Click Next然后 Click Install 等安裝完成即可,下圖安裝路徑,建議自定義一下,別安裝在系統盤
安裝完成
二:配置使用
- 創建幾個文件夾具體如下:數據庫路徑(data目錄)、日志路徑(logs目錄)和日志文件(logs/mongo.log文件)
- 創建配置文件mongo.conf,文件內容如下:
- 啟動MongoDB服務
mongod –config “D:\Mongo\mongo.conf”
這個是使用自己剛剛在上面配置的配置文件來啟動服務的。注意修改成自己的目錄位置
- 創建並啟動MongoDB服務
如果每次都如上操作,豈不是相當麻煩,按照如下命令來創建並啟動MongoDB服務,就可以通過windows服務來管理MongoDB的啟動和關閉了
mongod –config “D:\Mongo\mongo.conf” –install –serviceName “MongoDB”
net start MongoDB
執行完之后,就可以去服務里看是否有成功創建了
然后瀏覽器中輸入http://127.0.0.1:27017,看到如下界面即說明啟動成功
- 接下來使用Robomongo客戶端管理工具就可以連接,后因收購被改名為Robo 3T
Nice,連接成功,如下圖
MongoDB會默認創建admin和local庫,不過剛才安裝的Mongodb並不需要權限驗證,如果數據安全性不需要很高,則可以安裝不需要驗證的db庫,通過設置服務器之間的白名單做到訪問安全
三:安裝Authorization校驗的MongoDB
需要注意的是:如果之前安裝MongoDB時不需要 Auth,那么必須卸載MongoDB服務,進行重新安裝,設置賬號權限才生效!
首先卸載之前的mongodb服務,接着刪除data文件夾下所有東西,再清空log
然后再次注冊個服務的話,命令多添加個 –auth
mongod –config “D:\Mongo\mongo.conf” –auth –install –serviceName “MongoDB”
net start MongoDB
此時就可以用Robomongo工具進行連接試一下
mongod.exe --remove --serviceName "MongoDB" mongod --config "D:\Mongo\mongo.conf" --auth --install --serviceName "MongoDB" net start MongoDB use admin db.createUser({user: "admin",pwd: "password",roles: [ { role: "root", db: "admin" } ]}); exit
e.g. 新建數據庫
mongo --port 27017 -u admin -p password --authenticationDatabase admin 創建數據庫lxkdb,當在這個數據庫寫入數據的時候,這個數據庫就出現了 use minily 創建普通賬戶 db.createUser({user: "minily",pwd: "password",roles: [{ role: "readWrite", db: "minily" }]}); 選擇剛剛創建的數據庫 use minily 然后進行數據庫權限的認證,返回1就是認證OK,0就是認證失敗。這個也是重點,在操作數據庫之前要有那么一次的權限認證 db.auth('minily','password')
新建Collection,並添加一條數據
db.student.save({name: 'zhangsan', age: 25, sex: true}); 在數據庫minily中,插入一條數據,這個表叫student show collections 顯示當前數據庫有的集合,也就是表 db.student.find() 查student表全部
·以上操作在Robomongo工具上來實現,簡直不要太爽
·索引等進階知識可以看官網 db.collection.createIndex()
roles 用戶角色:
- 數據庫用戶角色:read、readWrite;
- 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 備份恢復角色:backup、restore;
- 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級用戶角色:root
快速啟動和停止服務的快捷鍵
a. net start serviceName
b. net stop serviceName
最后,每次要在命令行使用mongo命令,都得進入到對應的bin目錄下,這樣很是麻煩,配置個系統環境變量,方便直接使用
這樣就可以直接在cmd命令行,不需要進行目錄切換,就可以直接使用 mongo.exe 命令
—————————常用命令以及T-SQL增刪改查語句————————————–
查看表基本信息:db.getCollection(‘AUDCAD’).stats() 類似於MySql的EXPLAIN
倒序查詢數據:db.getCollection(‘AUDCAD’).find({}).sort({field:-1})
show dbs; #查看全部數據庫
show collections; #顯示當前數據庫中的集合(類似關系數據庫中的表)
show users; #查看當前數據庫的用戶信息
use <db name="">; #切換數據庫跟mysql一樣
db;或者db.getName(); #查看當前所在數據庫
db.help(); #顯示數據庫操作命令,里面有很多的命令
db.foo.help(); #顯示集合操作命令,同樣有很多的命令,foo指的是當前數據庫下,一個叫foo的集合,並非真正意義上的命令
db.foo.find(); #對於當前數據庫中的foo集合進行數據查找(由於沒有條件,會列出所有數據)
db.foo.find( { a : 1 } ); #對於當前數據庫中的foo集合進行查找,條件是數據中有一個屬性叫a,且a的值為1
db.version(); #當前db版本
db.getMongo(); #查看當前db的連接機器地址
db.dropDatabase(); #刪除數據庫
增(insert)
1.單條數據插入
db.user.insert({“name”:”jack”,”age”:20})
2.批量數據插入采用命令行for循環
刪(remove)
1.不帶參數會刪除全部數據,且不可恢復,切記!
db.user.remove({“name”:”joe”})
改(update)
1.整體更新
var model = db.user.findOne({“name”:”jack”})
model.age=30
db.user.update({“name”:”jack”},model)
2.局部更新
● $inc修改器——比如我們做一個在線用戶狀態記錄,每次修改會在原有的基礎上自增$inc指定的值,如果“文檔”中沒有此key,則會創建key
db.user.update({“name”:”jack”},{$inc:{“age”:30}}) //年齡增加30
● $set修改器
db.user.update({“name”:”jack”},{$set:{“age”:10}}) //年齡變為10</db>
3.upsert操作 —— 如果沒有查到,就在數據庫里面新增一條,使用起來很簡單,將update的第三個參數設為true即可。
4.批量更新 —— 在mongodb中如果匹配多條,默認的情況下只更新第一條,那么如果我們有需求必須批量更新,那么在mongodb中實現也是很簡單的,在update的第四個參數中設為true即可
查(find)
1.查找key=value的數據
db.collection.find({ “key” : value })
2.key > value
db.collection.find({ “key” : { $gt: value } })
3.key < value
db.collection.find({ “key” : { $lt: value } })
4.key >= value
db.collection.find({ “key” : { $gte: value } })
5.key <= value
db.collection.find({ “key” : { $lte: value } })
6.value1 < key <value2 db.collection.find({="" "key"="" :="" {="" $gt:="" value1="" ,="" $lt:="" value2="" }="" })="" 7.key="" <=""> value
db.collection.find({ “key” : { $ne: value } })
8.取模運算,條件相當於key % 10 == 1 即key除以10余數為1的
db.collection.find({ “key” : { $mod : [ 10 , 1 ] } })
9.不屬於,條件相當於key的值不屬於[ 1, 2, 3 ]中任何一個
db.collection.find({ “key” : { $nin: [ 1, 2, 3 ] } })
10.屬於,條件相當於key等於[ 1, 2, 3 ]中任何一個
db.collection.find({ “key” : { $in: [ 1, 2, 3 ] } })
11.$size 數量、尺寸,條件相當於key的值的數量是1(key必須是數組,一個值的情況不能算是數量為1的數組)
db.collection.find({ “key” : { $size: 1 } })
12.$exists 字段存在,true返回存在字段key的數據,false返回不存在字度key的數據
db.collection.find({ “key” : { $exists : true|false } })
13.正則,類似like;“i”忽略大小寫,“m”支持多行.如joe會匹配出來
db.collection.find({ “name”:/^j/,”name”:/e$/ })
14.$or或 (注意:MongoDB 1.5.3后版本可用),符合條件a=1的或者符合條件b=2的數據都會查詢出來
db.collection.find({ $or : [{a : 1}, {b : 2} ] })
15.符合條件key=value ,同時符合其他兩個條件中任意一個的數據
db.collection.find({ “key”: value , $or : [{ a : 1 } , { b : 2 }] })
16.內嵌對象中的值匹配,注意:”key.subkey”必須加引號
db.collection.find({ “key.subkey” :value })
17.這是一個與其他查詢條件組合使用的操作符,不會單獨使用。上述查詢條件得到的結果集加上$not之后就能獲得相反的集合。
db.collection.find({ “key”: { $not : /^val.val$/i } })
18.$where中的value,就是我們非常熟悉,非常熱愛的js
db.collection.find({ $where:function(){return this.name==”joe”} })</value2>
- 指定時間刪除
db.getCollection(‘AUDCHF’).remove({“ctm”:{$lt:1534322144}}) - 設置過期時間(索引)
db.collection.createIndex({“createdTime”: 1},{expireAfterSeconds: 300})
其中,dollection表名,expireTime是索引所在的字段,為Date格式,expireAfterSeconds表示0秒之后過期。該方式,可以傳入一個過期時間到數據庫中,到了指定時間,數據即刪除
—————————簡介以及優缺點————————————–
mongodb是一個介於nosql數據庫和mysql數據庫之間的一個數據存儲系統,它沒有嚴格的數據格式,但同時支持復雜查詢,而且自帶sharding模式和Replica Set模式,支持分片模式,復制模式,自動故障處理,自動故障轉移,自動擴容,全內容索引,動態查詢等功能。擴展性和功能都比較強大。
據稱,寫入百萬級的數據,MongoDB基本上十分鍾以下可以解決。
雖然MongoDB是以數據庫的身份存在,但也常有人將它與Redis、Memcache比較,可見Mongo的價值所在。
缺點
l 不支持事務操作
l 空間預分配,占用過大
l MongoDB沒有如MySQL那樣成熟的維護工具
l 無法進行關聯表外鍵,不適用於關系多的數據
l 復雜聚合操作通過mapreduce創建,速度慢
| 模式自由, 自由靈活的文件存儲格式帶來的數據錯誤
| 刪除數據集合后空間不會自動釋放,只有用db.repairDatabase()去修復才能釋放 - 慎用!
優點
l 文檔結構的存儲方式,能夠更便捷的獲取數據
l 內置GridFS,支持大容量的存儲
l 內置Sharding,分片簡單
l 海量數據下,性能優越
l 支持自動故障恢復(復制集)
MongoDB不可用於較復雜的業務邏輯,不擅長較頻繁的請求,特別是涉及到多線程;多用於不頻繁請求使用,交互邏輯少的設計中