mongoDB
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 # 解壓
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 將解壓包拷貝到指定目錄
MongoDB 的可執行文件位於 bin 目錄下,所以可以將其添加到 PATH 路徑中:
export PATH=/usr/local/mongodb/bin:$PATH
創建數據庫目錄:
MongoDB的數據存儲在data目錄的db目錄下,但是這個目錄在安裝過程不會自動創建,所以你需要手動創建data目錄,並在data目錄中創建db目錄。
mkdir -p /data/db
mkdir -p /logs
進入安裝路徑:
創建mongodb.conf配置文件:vim mongodb.conf
dbpath = /data/db #數據文件存放目錄
logpath = /logs/mongodb.log #日誌文件存放目錄
port = 27017 #端口
fork = true #以守護程序的方式啟用,即在後臺運行
auth=true #需要認證。如果放開註釋,就必須創建MongoDB的賬號,使用賬號與密碼才可遠程訪問,第一次安裝建議註釋
bind_ip=0.0.0.0 #允許遠程訪問,或者直接註釋,127.0.0.1是隻允許本地訪問
命令行中運行 MongoDB 服務:
./mongod -f mongodb.conf
查看端口映射檢查是否啟動成功:
0
netstat -nltp|grep mongod
mongod命令關閉:mongod 命令的 shutdown 選項能幹淨的關閉 MongoDB 服務,會釋放內存中MongoDB佔用的內存
./mongod --shutdown
kill MongoDB的pid ,直接殺死MongoDB的進程id。kill -9 pid 強制殺死,有時可能會出現錯誤關不掉時就可使用這種強制方式,
但注意這種方式可能並不會馬上釋放內存中MongoDB佔用的內存,且如果這時候有數據往MongoDB新增可能會導致數據丟失。
注:查看pid:ps -ef | grep mongo , 結果的第二列就是pid。
進入mongodb中:
./mongo
使用admin數據庫:use admin ,注意admin數據庫下創建的賬號權限是所有庫通用的,即是全局認證的。
創建用戶:db.createUser({ user: 'root', pwd: 'root',roles: [ { role: "dbOwner", db: "test" }] })
這時候MongoDB的admin數據庫就有了賬號,啟用auth=true,重啟後,再連接就需要賬號密碼授權了。
db.firstCollection.save({"name":"gaojianshuai","age":"25"})
可查看是否新增成功:db.firstCollection.find({name:"gaojianshuai"})
mongodb語法
數據庫:
show dbs;//查看所有的數據庫
db;//查看當前窗口所在的數據庫
use 數據庫名;//如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
注:show dbs執行結果沒有看到test庫,但是db查看當前庫確是test庫,因為test庫中剛開始沒有任何數據並且是在內存中的,有了數據後就會顯示出來了(其他新創建的數據庫也是如此)
db.dropDatabase();//刪除當前數據庫,默認為 test,故要切換到某個數據庫下進行刪除
集合:
顯式創建集合:db.createCollection("collectionName");//創建一個名為collectionName的集合,創建完成後會返回 {"ok",1} json串
隱式創建集合:db.collection2.insert({name:"xiaomu",age:20});//往collection2集合中添加數據來創建集合,如果集合不存在就自動創建集合,返回:WriteResult({"nInserted":1})
show collections;//查看集合
db.collection1.count();//統計集合collection1中的數據數量
db.collection1.drop();//刪除集合collection1
注:mongo中支持js,可通過js操作實現批零處理,如:for(var i=0;i<1000;i++){db.collection2.insert({name:"xiaomu"+i,age:20+i});}
固定集合
固定集合指的是事先創建而且大小固定的集合。
固定集合特性:固定集合很想環形隊列,如果空間不足,最早的文檔就會被刪除,為新的文檔騰出空間。一般來說,固定集合適用於任何想要自動淘汰過期屬性的場景,沒有太多的操作限制.
db.createCollection("collectionName",{capped:true,size:10000,max:100});//size指定集合大小,單位為KB,max指定文檔數量
當文檔數量上限時必須同時指定大小。淘汰機制只有在容量還沒滿時才會依據數量來工作。要是容量滿了則會依據容量來工作。
查詢:
固定條件查詢:
注:mongodb中每條數據都有一個id,用來唯一標識一條數據,id由mongo本身來維護
db.collection1.find();//查詢集合中所有的數據
db.collection1.find({age:7});//查詢年齡為7的數據
db.collection1.find({age:7},{name:1});
//查詢年齡為7的數據,只返回name字段數據;兩個大括號,前面的存查詢條件,後面的存返回條件,返回條件字段1表示true,表示此字段返回,如果name後面的1改為0則表示不返回name字段,返回除name字段以外的其他字段
注意:如果設置返回字段有為0的已經表示查詢所有除了某字段以外的所有字段就不能再設置某個字段為1了,有語法衝突
db.collection1.find({age:7,name:"xiaomu"},{name:1,age:1});//查詢age為7,name為xiaomu的數據,返回name和age字段
注:多條件查詢此處是並列,但是如果多個條件都相同的話如{name:"xiaoli",name:"xioamu"}則會只查詢後一個條件的數據
db.collection1.find({},{age:1});//查詢所有的數據,返回age字段
db.collection1.findOne();//查詢集合的第一條數據
篩選查詢:
gt(greater than)大於;lt(less than)小於;gte(greater then equal)大於等於;lte(less than equal)小於等於;ne(not equal)不等於
db.collection1.find({age:{$gt:10}});//查詢age大於10的數據
包含
db.collection1.find({price:{$all:[1,2]}});//(包含。。並且包含。。)此處price是個數組,此方法查詢所有price包含1和2的數據
db.collection1.find({price:{$in:[1,2]}});//(包含。。或者包含。。)查詢price中含有1或者2的數據
db.collection1.find({price:{$nin:[1,2]}});//(不包含。。並且不包含。。)查詢price中不含有1並且不含有2的數據
db.collection1.find({$or:[{name:"xiaomu"},{price:{$in:[3]}}]});//(。。或者。。)查詢name為xiaomu或者價格包含3的數據
db.collection1.find({$nor:[{name:"xiaomu"},{name:"xiaoli"}]});//(既不也不)查詢name不為xiaomu或者name不為xiaoli的數據
分頁:
db.collection1.find().skip(0).limit(10);//查詢從0條開始,查詢10條,skip()方法默認參數為 0 ,表示跳過的條數
排序:
db.collection1.find().sort({age:1});//按照年齡升序排序,為-1的話表示降序排序
存在
db.c2.find({hight:{$exists:1}});//查詢存在hight字段的數據
刪除:
db.collection1.remove({age:7,name:"xiaomu"});//刪除age為7,name為xiaomu的數據
更新
db.c3.update({age:12},{name:"xiaoxiao"});//本意為將age為12的數據中的name更新為xiaoxiao,但是實際效果是隻是將age為12的滿足條件數據的第一條整條數據覆蓋為name:“xiaoxiao”
db.c3.update({age:15},{$set:{name:"xiaolili"}});//本意為將age為15的數據的name修改為xiaolili,但是實際效果是隻修改了查詢到的第一條數據
db.c3.update({age:15},{$set:{name:"xiaolili"}},1,1);//將age為15的數據的name修改為xiaolili
總共4個參數,第四個參數表示有多條數據符合篩選條件的話是否全部更改,默認為0只改第一條,改為1後表示全部更改
第3個參數1表示如果沒有符合條件的記錄是否新增一條記錄,1表示新增,0表示不新增
如:db.c3.update({age:21},{$set:{name:"xiaolili"}},1,1);//如果不存在age為21的數據則增加一條,增加的數據為{age:12,name:”xiaolili”}
db.c3.update({age:12},{name:"xiaoxiao"},{$inc:{age:-2}},1,1);//$inc表示使某個鍵值加減指定的數值,此處表示將name為xiaoxiao的數據的age字段的值減2
db.c3.update({age:12},{name:"xiaoxiao"},{$inc:{age:1}},0,1);//$unset用來刪除某個鍵,此處表示刪除name為xiaoxiao的數據的age字段
索引
mongo默認為每條數據的_id字段建索引
db.c3.ensureIndex({age:1});//為age字段建普通索引
db.c3.dropIndex({age:1});//刪除age字段的索引
db.c3.ensureIndex({age:1},{unique:true});//為age字段建唯一索引,在為字段建了唯一索引後就不能再添加相同值的記錄了
數據備份與恢復
備份:mongodump -h dbhost -d dbname -o dbdirectory
-h:mongodb所在服務器地址,如127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
-d:需要備份的數據庫實例,如:test
-o:需要備份的數據存放的位置,例如:d:data (如果沒有則自動創建)
恢復:mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:mongodb所在服務器地址,如127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
-d:需要備份的數據庫實例,如:test,此名稱也可以和備份的時候不一樣
-directoryperdb :備份數據所在的位置,例如:d:data
注意:恢復時要在退出mongo命令行狀態下執行
導入與導出
導出:mongoexport -h dbhost -d dbname -c collectionName -o output
-h:數據庫地址
-d:指明使用的庫
-c:指明要導出的集合
-o:指明要導出的文件路徑加文件名,文件名可以是txt、word、excel等多種文件格式
導入:mongoimport -h dbhost -d dbname -c collectionname 文件的地址路徑
-h:數據庫地址
-d:指明使用的庫
-c:指明要導出的集合
注意:導入時要在退出mongo命令行狀態下執行,導入導出與數據備份和恢復相似