Ubuntu14.04下初步使用MongoDB


 

 

  不多說,直接上干貨!

 

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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM