Ubuntu14.04下初步使用MongoDB

 

 

  很少說,直接上乾貨!php

 

Ubuntu14.04下Mongodb(在線安裝方式|apt-get)安裝部署步驟(圖文詳解)(博主推薦)

 

 

shell命令模式

  輸入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
> 

 

 

 

 

 

mongo經常使用操做命令:

  數據庫相關 (這只是部分而已)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();

相關文章
相關標籤/搜索