不多說,直接上干貨!
Ubuntu14.04下Mongodb(在線安裝方式|apt-get)安裝部署步驟(圖文詳解)(博主推薦)
shell命令模式
輸入mongo進入shell命令模式,默認連接的數據庫是test數據庫,在此之前一定要確保你已經啟動了MongoDB,否則會出現錯誤,啟動之后運行成功,如下截圖:

root@zhouls-virtual-machine:~# mongo MongoDB shell version: 2.4.9 connecting to: test >
或者以這種方式來連接

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 >
mongo常用操作命令:
數據庫相關 (這只是部分而已)
show dbs:顯示數據庫列表
show collections:顯示當前數據庫中的集合(類似關系數據庫中的表table)
show users:顯示所有用戶
use yourDB:切換當前數據庫至yourDB
db.help() :顯示數據庫操作命令
db.yourCollection.help() :顯示集合操作命令,yourCollection是集合名
注意:MongoDB沒有創建數據庫的命令,如果你想創建一個“School”的數據庫,先運行use School命令,之后做一些操作(如:創建聚集集合db.createCollection('teacher')),這樣就可以創建一個名叫“School”的數據庫。截圖如下:

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)。
1、切換到School數據庫
use School #切換到School數據庫。MongoDB 無需預創建School數據庫,在使用時會自動創建
剛上面,我已經創建好了。
2、創建Collection
db.createCollection('teacher') #創建一個聚集集合。MongoDB 其實在插入數據的時候,也會自動創建對應的集合,無需預定義集合
剛上面,我已經創建好了。

> show collections
system.indexes
teacher
>
這樣就顯示,在teacher數據庫里,創建集合(即關系型數據庫里叫表),成功!
3、插入數據
與數據庫創建類似,插入數據時也會自動創建集合(即關系型數據庫里的表)。
插入數據有兩種方式: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
>
4、查找數據 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 }
>
5、修改數據 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 }
>
6、刪除數據
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 } >
6、退出shell命令模式
輸入exit或者Ctrl+C退出shell命令模式

擴展學習
1、安裝:
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數據庫進程的信息
關閉:1、ctrl+c 2、db.shutdownServer()
2、mongodb客戶端工具:
mongo 127.0.0.1/27017/admin 不填,默認連接本機test數據庫。
1、查看數據庫
show dbs
2、創建數據庫
use xxlong:系統自動創建一個數據庫(xxlong)。如果use之后沒有創建 任何集合。系統就會刪除這個數據庫。
3、給定數據庫添加集合(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'});
4、查看數據庫中的所有集合
show collections;
5、查看定制文檔的數據
db.student.find();查看所有數據
db.student.findOne();查看第一條數據
6、更新文檔(相當於傳統數據庫的記錄)數據
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"]}}}); 批量增加
7、刪除文檔數據
db.student.remove({_id:10});刪除id為10的文檔的數據。
8、刪除庫中的集合
db.student.drop();
9、刪除數據庫
db.dropDatabase();
10、Shell的help
db.help();查看操作數據庫的方法
db.student.help();查看操作集合的(student)方法
11、mongodb的api
http://api.mongodb.org/js/2.1.2/index.html
12、數據庫和集合命名規范
1、不能是空字符串
2、不能含有‘ ’、(空格)、,、$、/、\、和\O(空字符)
3、應全部小寫
4、最多64個字節
5、數據庫名不能與現有系統保留庫同名。如admin,config,local
13、ecllipse中裝入mongodb插件
help-->install new soft-->add-->Mongodb,http://www.jumperz.net/update/
14、查找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});
15、索引
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})
16、查詢結果的個數
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”})
17、 固定集合
1、固定集合默認是沒有索引的就算是_id也是沒有索引的
2、由於不需分配新的空間,它的插入速度是非常快的
3、固定集合的順序是確定的,導致查詢速度是非常快的
4、最適合的是應用就是日志管理
5、創建固定集合
創建一個新的固定集合,大小是100字節,可以存儲文檔十個。
db.createCollection("myColl",{size:100,capped:true,max:10});
6、將一個普通集合轉為一個固定集合。
db.runCommand({"convertToCapped":"student","size":10000});
7、反向排序,默認是插入順序排序
db.student.find().sort({$natural:-1});
8、尾部游標,可惜shell不支持,java和php等驅動是支持的
18、文件GridFS
1、上傳一個文件(將/home/xxlong/xxlong.txt上傳到數據庫中,並重新命名為b.txt)
控制台(/bin/bash):mongofiles -d xxlong_db -l "/home/xxlong/xxlong.txt" put "b.txt"
2、查看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"
19、服務器端運行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
21、導出數據
打開控制台(/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
22、導入數據
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"
23、運行時備份
導出127.0.0.1服務下的27017的數據庫xxlong數據庫
切換到數據庫目錄下:
控制台:mongodump --host 127.0.0.1:27017 -d xxlong_db -o /home/xxlong/
/home/xxlong 目錄下是數據庫名(xxlong_db)的文件夾,里面是備份的數據
24、運行時恢復
切換到數據庫目錄下:
控制台:mongorestore --host 127.0.0.1:27017 -d xxlong_db /home/xxlong/xxlong_db
25、上鎖
上鎖可以是緩沖區中的數據全部放到數據庫中
db.runCommand({fsync:1,lock:1})
26、解鎖
db.fsyncUnlock();
27、數據修復
當停電等不可逆轉災難來臨的時候,由於mongodb的存儲結構導致會產生垃圾數據,在數據恢復以后這垃圾數據依然存在,這是數據庫提供一個自我修復的能力。
db.repairDatabase();
