很少說,直接上乾貨!php
輸入mongo
進入shell命令模式,默認鏈接的數據庫是test數據庫,在此以前必定要確保你已經啓動了MongoDB,不然會出現錯誤,啓動以後運行成功,以下截圖: html
root@zhouls-virtual-machine:~# mongo MongoDB shell version: 2.4.9 connecting to: test >
或者以這種方式來鏈接java
root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root MongoDB shell version: 2.4.9 connecting to: 192.168.80.31:27017/admin >
數據庫相關 (這只是部分而已)c++
show dbs:顯示數據庫列表
show collections:顯示當前數據庫中的集合(相似關係數據庫中的表table)
show users:顯示全部用戶
use yourDB:切換當前數據庫至yourDB
db.help() :顯示數據庫操做命令
db.yourCollection.help() :顯示集合操做命令,yourCollection是集合名
注意:MongoDB沒有建立數據庫的命令,若是你想建立一個「School」的數據庫,先運行use School
命令,以後作一些操做(如:建立彙集集合db.createCollection('teacher')
),這樣就能夠建立一個名叫「School」的數據庫。截圖以下: web
root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root MongoDB shell version: 2.4.9 connecting to: 192.168.80.31:27017/admin > show dbs admin 0.203125GB local 0.078125GB test 0.203125GB > use school switched to db school > db.createCollection('teacher') { "ok" : 1 } > show dbs admin 0.203125GB local 0.078125GB school 0.203125GB test 0.203125GB >
下面以一個School數據庫爲例,在School數據庫中建立兩個集合teacher和student,並對student集合中的數據進行增刪改查基本操做(集合Collection至關於關係型數據庫中的表table)。 sql
一、切換到School數據庫mongodb
use School #切換到School數據庫。MongoDB 無需預建立School數據庫,在使用時會自動建立
剛上面,我已經建立好了。shell
二、建立Collection數據庫
db.createCollection('teacher') #建立一個彙集集合。MongoDB 其實在插入數據的時候,也會自動建立對應的集合,無需預約義集合
剛上面,我已經建立好了。json
> show collections
system.indexes
teacher
>
這樣就顯示,在teacher數據庫裏,建立集合(即關係型數據庫裏叫表),成功!
三、插入數據
與數據庫建立相似,插入數據時也會自動建立集合(即關係型數據庫裏的表)。
插入數據有兩種方式: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字段,二者做用相同都是插入數據。
截圖以下:
> db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 20 } > db.student.save({_id:1, sname: 'zhangsan', sage: 22}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } > db.student.insert({_id:1, sname: 'zhangsan', sage: 25}) E11000 duplicate key error index: school.student.$_id_ dup key: { : 1.0 } > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } >
添加的數據其結構是鬆散的,只要是bson格式都可,列屬性均不固定,根據添加的數據爲準。先定義數據,再插入,就能夠一次性插入多條數據,截圖以下:
> s = [{sname:'lisi',sage:20},{sname:'wangwu',sage:20},{sname:'chenliu',sage:20}] [ { "sname" : "lisi", "sage" : 20 }, { "sname" : "wangwu", "sage" : 20 }, { "sname" : "chenliu", "sage" : 20 } ] > db.student.insert(s) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 } >
運行完以上例子,student集合已自動建立,這也說明 MongoDB 不須要預先定義 collection ,在第一次插入數據後,collection 會自動的建立。截圖以下:
> show collections
student
system.indexes
teacher
>
四、查找數據 db.youCollection.find(criteria, filterDisplay)
criteria :查詢條件,可選
filterDisplay:篩選顯示部分數據,如顯示指定列數據,可選(當選擇時,第一個參數不可省略,若查詢條件爲空,可用{}作佔位符,以下例第三句
db.student.find() #查詢全部記錄。至關於:select * from student db.student.find({sname: 'lisi'}) #查詢sname='lisi'的記錄。至關於: select * from student where sname='lisi' db.student.find({},{sname:1, sage:1}) #查詢指定列sname、sage數據。至關於:select sname,sage from student。sname:1表示返回sname列,默認_id字段也是返回的,能夠添加_id:0(意爲不返回_id)寫成{sname: 1, sage: 1,_id:0},就不會返回默認的_id字段了 db.student.find({sname: 'zhangsan', sage: 22}) #and 與條件查詢。至關於:select * from student where sname = 'zhangsan' and sage = 22 db.student.find({$or: [{sage: 22}, {sage: 25}]}) #or 條件查詢。至關於:select * from student where sage = 22 or sage = 25
查詢操做相似,這裏只給出db.student.find({sname: 'lisi'})
查詢的截圖,以下:
> db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } >
五、修改數據 db.youCollection.update(criteria, objNew, upsert, multi )
criteria: update的查詢條件,相似sql update查詢內where後面的
objNew : update的對象和一些更新的操做符(如$set
)等,也能夠理解爲sql update查詢內set後面的。
upsert : 若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
multi: mongodb默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。默認false,只修改匹配到的第一條數據。
其中criteria和objNew是必選參數,upsert和multi可選參數
舉例以下:
db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true) #至關於:update student set sage =30 where sname = 'lisi';
> db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } > db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true) > db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } >
六、刪除數據
db.student.remove({sname: 'chenliu'}) #至關於:delete from student where sname='chenliu'
> db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 } > db.student.remove({sname: 'chenliu'}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } >
六、退出shell命令模式
輸入exit
或者Ctrl+C
退出shell命令模式
擴展學習
一、安裝:
mongod -dbpath /home/xxlong/myInstall/mongodb_data
默認是在
dbpath=/var/lib/mongodb
mongod 啓動數據庫進程
--dbpath 指定數據庫的目錄
--port 指定數據庫的端口,默認是27017
--bind_ip 綁定ip
--directoryperdb 爲每一個db建立一個獨立的子目錄
--logpath 指定日誌存放目錄,默認是控制檯
--auth 用安全認證方式啓動數據庫
--config 指定啓動項用文件的路徑
--fork 用守護進程的方式啓動mongodb
--rest:是打開web監控頁面,好比咱們這裏監聽10001端口,則打開http://10.1.49.225:11001/就能夠看到這個mongodb數據庫進程的信息
關閉:一、ctrl+c 二、db.shutdownServer()
二、mongodb客戶端工具:
mongo 127.0.0.1/27017/admin 不填,默認鏈接本機test數據庫。
一、查看數據庫
show dbs
二、建立數據庫
use xxlong:系統自動建立一個數據庫(xxlong)。若是use以後沒有建立 任何集合。系統就會刪除這個數據庫。
三、給定數據庫添加集合(student)並添加記錄(insert)
db.[documentName].insert({...});
db.student.insert({_id:13,name:'Cat',sex:1,age:23,score:[60,71,81,91,100]});
批量增長:for(var i=1;i<10;i++){
db.student.insert({_id:i,name:'xxl',age:i});
}
insert在_id相同的時候會報錯,而save則不報錯,而是更新
db.student.save({_id:13,name:'xxlong'});
四、查看數據庫中的全部集合
show collections;
五、查看定製文檔的數據
db.student.find();查看全部數據
db.student.findOne();查看第一條數據
六、更新文檔(至關於傳統數據庫的記錄)數據
db.student.update({_id:10},{$set:{age:21}});id爲10的文檔的age改成21,$set表示有這個鍵則修改,沒有這個鍵則增長
db.student.update({age:10},{$set:{sex:1}},true,true),這個true表示查到年齡爲10則修改, 查不到則插入,false表示爲查到則修改,查不到什麼也不作,不寫則默認爲false(至關於
InsertOrUpdate);這個true表示批量增長(全部年齡爲10,修改性別爲1),false則不是批量增長,默認爲false;
db.student.update({_id:10},{$inc:{age:1}});id爲10的文檔的age自動加1
db.student.update({_id:10},{$unset:{age:x}});刪除id爲10的文檔的age字段,x爲任意數字
db.student.update({_id:13},{$push:{score:[100,101]}});score數組中新增值100,101
若是score鍵不存在,則新增長這個鍵,必須爲數組
db.student.update({_id:13},{$pop:{score:x}});刪除數組中的值,x爲1刪除最後一個,x爲-1 刪除最前的一個
db.student.update({_id:3},{$pull:{course:"computer"}}); 刪除數組course中的computer值(能夠爲多個computer值)
db.student.update({_id:3},{$pullAll:{course:["math","english"]}}); 刪除數組中多個不一樣的值
db.student.update({_id:10},{$rename:{'age':'AGE'}});修改id爲10的文檔的age字段名
db.student.update({_id:3},{$set:{course:['math','computer']}})
db.student.update({_id:1},{$addToSet:{course:'math'}})結果:math,computer
db.student.update({_id:1},{$addToSet:{course:'english'}})結果:math,computer,english
addToSet:目標數組存在新增長的項則不增長,不存在則增長(數組中有math,computer,再update math時不增長,而update english時,數組中沒有english,則增長)
db.student.update({"_id":3},{$addToSet:{course:{$each:
["math","english","Chinese"]}}}); 批量增長
七、刪除文檔數據
db.student.remove({_id:10});刪除id爲10的文檔的數據。
八、刪除庫中的集合
db.student.drop();
九、刪除數據庫
db.dropDatabase();
十、Shell的help
db.help();查看操做數據庫的方法
db.student.help();查看操做集合的(student)方法
十一、mongodb的api
http://api.mongodb.org/js/2.1.2/index.html
十二、數據庫和集合命名規範
一、不能是空字符串
二、不能含有‘ ’、(空格)、,、$、/、\、和\O(空字符)
三、應所有小寫
四、最多64個字節
五、數據庫名不能與現有系統保留庫同名。如admin,config,local
1三、ecllipse中裝入mongodb插件
help-->install new soft-->add-->Mongodb,http://www.jumperz.net/update/
1四、查找db.[documentName].find({條件},{鍵指定})
查找全部年齡在25至27歲之間的學生
db.student2.find({"age":{$lte:27,$gte:25}},{"_id":0,"name":1,"age":1}); _id=0表示不顯示 id
查找全部不是美國的學生
db.student.find({"Country":{$ne:"USA"}},{"_id":0,"name":1,"Country":1});
查詢全部是美國和中國的學生
db.student.find({"Country":{$in:["USA","China"]}},{"_id":0,"name":1,"Country":1});
查詢全部不是美國和中國的學生
db.student2.find({"Country":{$nin:["USA","China"]}},{"_id":0,"name":1,"Country":1});
查詢全部數學成績大於65或者英語成績小於95的學生
db.student.find({$or:[{"Math":{$gt:65}},{"English":{$lt:95}}]},
{"_id":0,"name":1,"Math":1,"English":1});
查詢全部性別爲空的學生
db.student.find({"sex":{$in:[null]}},{"_id":0,"name":1});
查詢全部名字爲To的學生
db.student.find({"name":/To/},{"_id":0,"name":1});
查詢全部學生名字不含字母a的學生
db.student.find({"name":{$not:/a/}},{"_id":0,"name":1});
查詢數組book中有java和c++的學生信息
db.student.find({"book":{$all:["java","C++"]}},{"_id":0,"name":1});
查詢數組第二個值是java的學生信息
db.student.find({"book.1":"java"},{"_id":0,"name":1})
查詢數組長度是2的學生信息
db.student.find({"book":{$size:2}},{"_id":0,"name":1});
查詢名字含T的全部學生的書的數組的長度(遊標)
var student = db.student2.find({"name":/T/});
while(student.hasNext()){print(student.next().book.length)};
查詢學生的book數組中從下標1開始起共2個即book[1],book[2]
db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:[1,2]}})
查詢學生的book數組中最後一個元素
db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:-1}})
查詢前五條數據
db.student2.find({},{"_id":0,"name":1}).limit(5);
查詢從第七條開始後三條數據即第7,8,9
db.student2.find({},{"_id":0,"name":1}).limit(3).skip(6);
查詢的結果按年齡正序排序
db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:1});
查詢的結果按年齡逆序排序
db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:-1});
快照的使用
db.student2.find({$query:{"name":"Tom5"},snapshot:true},{"_id":0,"name":1});
1五、索引
var start = new Date();
for(var i=0;i<20000;i++){
db.student.insert({"number":i,"name":"student"+i});
}
var end = new Date();
print((end-start)+"ms");
創建索引,查找速度變快1是正序建立索引(正序:越早的建立時間),-1爲倒序建立索引(逆序:越遲的建立時間)
db.student.ensureIndex({"number":1});
var start = new Date();
db.student.find({"number":15997});
var end = new Date();
print((end-start)+"ms");
索引的建立在提升查詢性能的同時會影響插入的性能。對於常常查詢少插入的文檔能夠考慮用索引。
建立逆序索引name,並指定該索引名字爲studentname
db.student.ensureIndex({"name":-1},{"name":"studentname"});
建立惟一索引name
db.student.ensureIndex({"name":1},{"unique":true});
若是集合中已經有重複的文檔,踢出重複值
db.student.ensureIndex({"name":1},{"unique":true,"dropDups":true}) ;
指定查詢所使用的索引(name正序索引),指定索引必須是建立好的索引
db.student.find({"name":"student333"}).hint({"name":1});
查看本次查詢所使用的索引和查詢數據的狀態信息
db.student.find({"name":"student333"}).explain();
查看索引
db.system.indexes.find();
或db.system.namespaces.find();
不鎖表建立索引
db.student.ensureIndex({"name":1},{"unique":true,"background":true})
刪除索引
db.runCommand({"dropIndexes":"student",index:"name_1"});
批量刪除
db.runCommand({"dropIndexes":"student",index:"*"});
db.map.find():
{ "_id" : ObjectId("55ae30a55e9fc03a8994fb34"), "gis" : { "x" : 185, "y" : 150 } }
建立2d索引,默認會創建[-180,180]的索引
db.map.ensureIndex({"gis":"2d"},{"min":-1,"max":200});
查詢離點{70,180}最近的三個點
db.map.find({"gis":{$near:[70,180]}},{"gis":1,"_id":0}).limit(3);
查詢以點(50,50)和點(190,190)爲對角線的正方形中全部的點
db.map.find({"gis":{$within:{$box:[[50,50],[190,190]]}}},{"_id":0,"gis":1})
查詢以(65,80)爲點半徑爲50的圓內的點
db.map.find({"gis":{$within:{$center:[[65,80],50]}}},{"_id":0,"gis":1})
1六、查詢結果的個數
db.student.find().count();
去重操做
db.runCommand({distinct:」persons」,key:」country」}).values
Group使用
查詢服務器版本號和主機操做系統
db.runCommand({buildInfo:1});
查詢集合詳細信息,大小,空間,索引
db.runCommand({collStats:"student"});
查看mongodb命令
db.listCommands();
http://localhost:28017/_command
查看操做本集合最後一次錯誤信息
db.runCommand({getLastError:」student」})
1七、 固定集合
一、固定集合默認是沒有索引的就算是_id也是沒有索引的
二、因爲不需分配新的空間,它的插入速度是很是快的
三、固定集合的順序是肯定的,致使查詢速度是很是快的
四、最適合的是應用就是日誌管理
五、建立固定集合
建立一個新的固定集合,大小是100字節,能夠存儲文檔十個。
db.createCollection("myColl",{size:100,capped:true,max:10});
六、將一個普通集合轉爲一個固定集合。
db.runCommand({"convertToCapped":"student","size":10000});
七、反向排序,默認是插入順序排序
db.student.find().sort({$natural:-1});
八、尾部遊標,惋惜shell不支持,java和php等驅動是支持的
1八、文件GridFS
一、上傳一個文件(將/home/xxlong/xxlong.txt上傳到數據庫中,並從新命名爲b.txt)
控制檯(/bin/bash):mongofiles -d xxlong_db -l "/home/xxlong/xxlong.txt" put "b.txt"
二、查看GridFS的文件存儲狀態
show collections;
====>
fs.chunks
fs.files
db.fs.chunks.find();
===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000002"),
"files_id" : ObjectId("55af7b9e9199bc7fc2000001"),
"n" : 0,
"data" : BinData(0,"eHhsb25nIGxvbmcgaGVsbG8KMzExID
U2NyB5dWFuYmEKeHhsICB4aWFvCm
xvbmcJemkKdWVzdGMKCg==") }
db.fs.files.find();
===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000001"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2015-07-22T11:16:46.928Z"),
"length" : 58,
"md5" : "99eaa1494edf301e2c9bf51aee7f989e",
"filename" : "b.txt" }
查看文件內容
控制檯:mongofiles -d xxlong_db get "b.txt" shell沒法打開
查看全部文件
控制檯:mongofiles -d xxlong_db list
刪除已經存在的文件
控制檯:mongofiles -d xxlong_db delete "b.txt"
1九、服務器端運行eval
db.eval("function(name){return name}","xxl");
輸出:xxl
20、保存js全局變量,system.js是一個特殊的集合
db.system.js.insert({"_id":"show_name","value":"xxlong"}) ;
db.eval("return show_name") ===>xxlong
2一、導出數據
打開控制檯(/bin/bash)
-d 指定要導出的庫
-c 指定要導出的庫的集合
-o 數據導出後存放的路徑
-cvs指定導出的cvs格式
-q過濾導出
--type<json|csv|tsv>
切換到數據庫目錄下:
控制檯:mongoexport --host 127.0.0.1 --port 27017 -d xxlong_db -c student -o /home/xxlong/xxl.json
2二、導入數據
mongoimport -d xxlong_db -c student --file /home/xxlong/xxl.json
切換到數據庫目錄下:
控制檯:mongoimport --host 127.0.0.1 --port 27017 -d xxlong_db -c student110 --file "/home/xxlong/xxlong.json"
2三、運行時備份
導出127.0.0.1服務下的27017的數據庫xxlong數據庫
切換到數據庫目錄下:
控制檯:mongodump --host 127.0.0.1:27017 -d xxlong_db -o /home/xxlong/
/home/xxlong 目錄下是數據庫名(xxlong_db)的文件夾,裏面是備份的數據
2四、運行時恢復
切換到數據庫目錄下:
控制檯:mongorestore --host 127.0.0.1:27017 -d xxlong_db /home/xxlong/xxlong_db
2五、上鎖
上鎖能夠是緩衝區中的數據所有放到數據庫中
db.runCommand({fsync:1,lock:1})
2六、解鎖
db.fsyncUnlock();
2七、數據修復
當停電等不可逆轉災難來臨的時候,因爲mongodb的存儲結構致使會產生垃圾數據,在數據恢復之後這垃圾數據依然存在,這是數據庫提供一個自我修復的能力。
db.repairDatabase();